¿Por qué fue InsertHelper obsoleta?

He estado pasando bastante tiempo mirando algunos problemas de rendimiento en nuestro dispositivo, y me di cuenta de que tenemos bastantes aplicaciones todas haciendo lecturas / escrituras db.

Comencé usando la API de contactos para insertar nuevos contactos y filas de datos, y fue dolorosamente lento. 1 minuto 18 segundos para insertar alrededor de 1500 filas (250 contactos crudos y 1250 filas de datos).

Yo había utilizado el ayudante de inserción en otra aplicación para inserciones de rendimiento, y decidió escribir una aplicación de prueba que escribiría a separar db con métodos de inserto separado.

Cada db tiene una tabla, cada una con 4 columnas: _ID, Name, Time y Blob (todo del tipo 'string') – al igual que el proveedor de contactos define las columnas de datos.

_ID es auto incremento pk, Nombre simplemente inserta la misma cosa '1234567890', el tiempo es sólo la hora actual del sistema en milis, y BLob es una cadena w / length 6400 completo de la letra 'A' …

Primero comprobé el inserto masivo, pero lo único que hace es recorrer todos los insertos que ha definido, y es tan lento como hacer los insertos individualmente (o impacto de rendimiento insignificante).

He probado 3 métodos diferentes para hacer las inserciones: Método ContentValues ​​w / db.insert: SQLiteStatement w / statement.execute () (hecho dentro de una transacción). SqliteInsertHelper w / transacción.

Puedo proporcionar un cierto código, pero conseguí el mejor funcionamiento fuera del InsertHelper, y preguntándose porqué era deprecated:

Tiempo para insertar 100 registros ContentValues: 7.778 segundos (82 bytes escritos / ms) SQLiteStatement: 1.311 segundos (489 bytes escritos / ms) SqliteInsertHElper: 0.292 segundos (2197 bytes escritos / ms)

¿Algunas ideas?

InsertHelper permite a los usuarios hacer múltiples inserciones en una tabla utilizando la misma instrucción. Pero no es una buena manera de insertar como tal, ya que not thread-safe es not thread-safe .

Es difícil obtener información sobre por qué InsertHelper se ha despreciado sin ir al commit actual que lo desaconseja. El ingeniero que obsoleta InsertHelper dio la razón siguiente:

Esta clase no ofrece ninguna ventaja sobre SQLiteStatement y hace que el código sea más complejo y propenso a errores.

Después de la refactorización de InsertHelper a SQLiteStatement estoy de acuerdo. Una excepción son las funciones de enlace null-safe. Mientras InsertHelper llama automáticamente a bindNull () para usted, SQLiteStatement se bloquea si pasa, por ejemplo, una cadena nula y tiene que hacer su propia comprobación nula antes de llamar a bindString ().

Vea: https://android.googlesource.com/platform/frameworks/base/+/b33eb4e%5E!/

Debe utilizar las transacciones. . Si no crea explícitamente una transacción para una operación de base de datos, el marco crea uno para cada uno. Agrupe el objeto e inserte todos a la vez. Esto aumentará considerablemente el rendimiento.

  • SQLite - insertar una cadena con nuevas líneas en la base de datos desde el archivo csv
  • Convertir mm-dd-aaaa a aaaa-mm-dd
  • Acceso a una base de datos .sqlite descargada determinada en el almacenamiento externo desde una aplicación de Android
  • No se puede realizar la operación porque no hay ninguna transacción actual al insertar en la base de datos
  • Excepción de la base de datos SQLite de Android - código 14 (no se puede abrir el archivo de base de datos)
  • Excepción de puntero nulo de SQLite de SQLite
  • Problema de orden de consultas SQLite de Android
  • Unir tablas en android
  • ¿Detectando la transacción olvidada de SQLite en Android usando StrictMode?
  • SQLiteException: Token no reconocido al leer de la base de datos
  • "Código de error 5: la base de datos está bloqueada" cuando se utiliza un ContentProvider
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.