studio que example crear contentresolver contentprovider content android sqlite android-contentprovider bulkinsert android-sqlite

example - que es uri en android studio



Android: Inserción masiva, cuando InsertHelper está en desuso (4)

Acabo de hacer una copia de seguridad de la clase predeterminada manteniendo solo el código relacionado con InsertHelper, consulte esta información .

Estoy bastante seguro de que esto estaba en desuso para limpiar las clases de utilidades del SDK. Lo que queda con mi clase es solo usar cosas no desaprobadas.

Hay muchas respuestas y tutoriales que utilizan InsertHelper para realizar InsertHelper masivas rápidas en SQLiteDatabase.
Pero InsertHelper está en desuso a partir de la API 17.

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

Hasta ahora, mi mayor preocupación es que no es muy cómodo trabajar con SQLiteStatement, donde InsertHelper tenía columnas vinculantes y valores vinculantes, lo cual era algo trivial.


Estaba enfrentando el mismo problema y no podía encontrar cómo SQLiteStatement podía reemplazar fácilmente DatabaseUtils.InsertHelper ya que necesita construir la consulta SQL a mano.

Terminé usando SQLiteDatabase.insertOrThrow que puede reemplazar fácilmente el código existente. Solo tuve que agregar, a veces, un hack de columna nula para manejar los casos donde inserto ContentValues ​​vacío.

Sí, la declaración no se compila para ser reutilizada más tarde, pero crear una consulta INSERT a mano y vincular todos los parámetros es demasiado difícil. Me interesaría saber cuánto afectará este rendimiento al gran conjunto de datos de inserción masiva (InsertHelper solo está en desuso) en caso de que modifique su código.


SQLiteStatement también tiene métodos de enlace, extiende SQLiteProgram .

Solo ejecútalo 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 una buena solución 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 eches un vistazo a la aplicación Google IO, especialmente al provider , así es como los desarrolladores de google hacen esto, para que puedas estar seguro de que esta es la forma correcta.