Android: Bulk Insert, cuando InsertHelper está obsoleto

Hay muchas respuestas y tutoriales usando InsertHelper para hacer rápida inserción de volumen en SQLiteDatabase.
Pero InsertHelper está obsoleto a partir de la API 17.

¿Cuál es ahora el método más rápido para insertar grandes conjuntos de datos en Android SQLite?

Hasta ahora mi mayor preocupación es que SQLiteStatement no es muy cómodo para trabajar, donde InsertHelper tenía columnas vinculantes y valores de enlace, que era un poco trivial.

SQLiteStatement también tiene métodos vinculantes, extiende SQLiteProgram .

Simplemente ejecútelo en la transacción:

final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); final SQLiteStatement statement = db.compileStatement(INSERT_QUERY); db.beginTransaction(); try { for(MyBean bean : list){ statement.clearBindings(); statement.bindString(1, bean.getName()); // rest of bindings statement.execute(); //or executeInsert() if id is needed } db.setTransactionSuccessful(); } finally { db.endTransaction(); } 

EDITAR

No puedo encontrar la solución agradable en SQLiteQueryBuilder pero es tan simple como:

 final static String INSERT_QUERY = createInsert(DbSchema.TABLE_NAME, new String[]{DbSchema.NAME, DbSchema.TITLE, DbSchema.PHONE}); static public String createInsert(final String tableName, final String[] columnNames) { if (tableName == null || columnNames == null || columnNames.length == 0) { throw new IllegalArgumentException(); } final StringBuilder s = new StringBuilder(); s.append("INSERT INTO ").append(tableName).append(" ("); for (String column : columnNames) { s.append(column).append(" ,"); } int length = s.length(); s.delete(length - 2, length); s.append(") VALUES( "); for (int i = 0; i < columnNames.length; i++) { s.append(" ? ,"); } length = s.length(); s.delete(length - 2, length); s.append(")"); return s.toString(); } 

Te recomiendo que eche un vistazo a google IO aplicación, especialmente el proveedor , así es como desarrolladores de google hacer esto, por lo que puede estar seguro de que esta es la forma correcta.

Yo estaba enfrentando el mismo problema y no podía encontrar cómo SQLiteStatement fácilmente podría sustituir DatabaseUtils.InsertHelper como usted necesita para construir la consulta SQL a mano.

Terminé usando SQLiteDatabase.insertOrThrow que puede reemplazar fácilmente el código existente. Sólo tuve que añadir a veces un hack columna nula para manejar los casos en los que insertar vacío ContentValues.

Sí, la declaración no se compila para ser reutilizada más tarde, pero la construcción de una consulta INSERT a mano y la vinculación de todos los parámetros es demasiado dolor. Estaría interesado en saber cuánto afectará este rendimiento de impacto al conjunto de datos de grandes volúmenes insertados (InsertHelper solo se obsoleta) en caso de que modifique su código.

Acabo de hacer una copia de seguridad de la clase por defecto manteniendo sólo el código relacionado con InsertHelper, echa un vistazo a esta idea .

Estoy bastante seguro de que esto fue obsoleto para limpiar las clases SDK utils. Lo que queda de mi clase es sólo usar cosas no obsoletas.

  • Sincronización entre la base de datos SQL Lite en un dispositivo android y la base de datos de SQL Server
  • Opciones de SyncAdapter
  • Android - SQLite ContentResolver insertar / eliminar / actualizar en UI Thread?
  • Conjunto de conexiones SQLite
  • Android.database.CursorWindowAllocationException al mover un Cursor
  • Cómo insertar valor nulo en Sqlite con SQLiteStatement
  • No se puede crear tabla TEMP en Android sqlite
  • Android.database.sqlite.SQLITeException: no hay tal tabla: admin mientras compila: INSERT INTO ... etc
  • Mostrar datos SQLite en RecyclerView
  • ¿Podemos usar una base de datos SQLITE aldready preparada para una aplicación phonegap?
  • Detectar si una tabla contiene una columna en Android / sqlite
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.