El contenido de Android contentprovider lleva mucho tiempo

Hice mi propio contentprovider donde pongo una gran cantidad de datos a la vez con múltiples inserciones.

La aplicación recibirá los datos de una fuente externa y en este momento recibo alrededor de 30 elementos (por lo tanto, 30 veces un inserto).

Ahora me di cuenta de que esto requiere mucho tiempo precioso (unos 3 segundos, 100 ms en cada inserto).

¿Cómo puedo mejorar la velocidad del proveedor de contenido? Ya he intentado bulkInsert todos juntos, pero ellos que tardará hasta 5 seg.

Gracias por adelantado.

Envolver todo lo que en insertBulk en las transacciones.

Ejemplo:

  SQLiteDatabase sqlDB = mDB.getWritableDatabase(); sqlDB.beginTransaction(); try { for (ContentValues cv : values) { long newID = sqlDB.insertOrThrow(table, null, cv); if (newID <= 0) { throw new SQLException("Failed to insert row into " + uri); } } sqlDB.setTransactionSuccessful(); getContext().getContentResolver().notifyChange(uri, null); numInserted = values.length; } finally { sqlDB.endTransaction(); } 

bulkInsert no utiliza las transacciones de forma predeterminada, ya que el comportamiento por defecto simplemente llama insert :

Anule esta opción para manejar las solicitudes para insertar un conjunto de nuevas filas o la implementación predeterminada itera sobre los valores y la inserción de llamada (Uri, ContentValues) en cada uno de ellos.

Hacer las inserciones en una transacción mejora en gran medida la velocidad, ya que sólo una escritura a la base de datos actuall tiene lugar:

 db.beginTransaction(); try { // do the inserts db.setTransactionSuccessful() } finally { db.endTransaction(); } 

Yo estaba una vez experimentando tratando de mejorar la velocidad de escritura de alrededor de ~ 2000 escribe, y esta fue la única gran mejora que encontré.

Hacer db.setLockingEnabled(false) creo que dio alrededor de 1% de mejora, pero también debe asegurarse de que ningún otro hilo escribe en el db. La eliminación de índices redundantes también puede dar un impulso menor si la tabla es enorme.

  • Android - ¿Existe la base de datos SQLite?
  • ¿Puedo realizar esta consulta de Android con ContentResolver.query ()? (LEFT JOIN y CASE)
  • Clave Extranjera de SQLite
  • Cómo obtener el registro de llamadas desde fecha específica en android
  • Cómo escribir contiene consulta en SQLite fts3 fulltext search
  • Android: SQLite, cursor.moveToNext () siempre devuelve false
  • Android.database.sqlite.SQLiteException: la tabla X no tiene columna llamada Y:, mientras compila: INSERT INTO
  • Ejemplo de cuenta de SQLite
  • Colocación de varias tablas / columnas en un archivo CSV
  • Análogo incorrecto de cadenas de fecha en SimpleDateFormat
  • Se abren varias bases de datos de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.