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).
- Ormlite interior ensambla en tres tablas
- ¿Por qué no conectar android a la base de datos directamente?
- Android SQLite Query - Obteniendo los últimos 10 registros
- Problema de orden de consultas SQLite de Android
- Android: el valor de enlace en el índice 1 es nulo
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.
- Android / SQLite - Operación de bits en la cláusula WHERE
- Android - SQLiteException: near "=": error de sintaxis (código 1)
- Android, Ormlite, ubicación de DB
- Cómo diferenciar dos tablas
- ¿Es mi consulta sqlite equivocada?
- Android MediaStore obtiene distintas carpetas de archivos de música
- NPE intermitente al insertar datos en SQLite
- Multi-parámetro en ActiveAndroid
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.
- ¿Por qué cambia mi cursor del ratón a un signo más en Eclipse?
- Keytool genera huella digital SHA1 en lugar de MD5?