Pourquoi InsertHelper était-il obsolète?

J'ai passé un certain temps à regarder des problèmes de performance sur notre appareil et nous avons remarqué que nous avons plusieurs applications qui font db lit / écrit …

J'ai commencé par utiliser l'API Contacts pour insérer de nouveaux contacts et des lignes de données, et il était péniblement lent. 1 minute 18 secondes pour insérer environ 1500 lignes (250 contacts bruts et 1250 lignes de données).

  • Android: AutoCompleteTextView cache le clavier doux
  • L'authentification Gtalk XMPP SASL a échoué avec le mécanisme X-OAUTH2?
  • Glide Image extraction
  • Comment classer la mise en page Android sur un petit, moyen, grand, x grand écran?
  • Le serveur de rénovation carré se moque pour tester
  • Phonegap Media API (Android) - Le support n'est pas défini
  • J'avais utilisé l'assistant d'insertion dans une autre application pour les insertions de performance et j'ai décidé d'écrire une application de test qui écrirait dans des méthodes séparées d'insertion de db w / separer.

    Chaque db a une table, chaque w / 4 colonnes: _ID, Name, Time et Blob (tous types de 'string') – tout comme le fournisseur de contact définit les colonnes de données.

    _ID est un incrément automatique pk, le nom insère simplement la même chose '1234567890', l'heure est juste l'heure système actuelle dans milis, et BLob est une chaîne w / length 6400 pleine de la lettre 'A' …

    J'ai d'abord vérifié l'insert en vrac, mais tout ce qu'il fait est boucle toutes les insertions que vous avez définies et est tout aussi lent que les insertions individuellement (ou un impact négligeable sur la performance).

    J'ai testé 3 méthodes différentes pour effectuer les insertions: ContentValues ​​w / db.insert méthode: SQLiteStatement w / statement.execute () (fait dans une transaction). SqliteInsertHelper w / transaction.

    Je peux fournir un certain code, mais j'ai eu le meilleur rendement de InsertHelper, et je me demandais pourquoi il était obsolète:

    Temps d'insertion de 100 enregistrements ContentValues: 7.778 secondes (82 octets écrits / ms) SQLiteStatement: 1.311 secondes (489 octets écrits / ms) SqliteInsertHElper: 0.292 secondes (2197 octets écrits / ms)

    Des idées?

  • EditText ajouté n'est pas un TextInputEditText. Passez à l'utilisation de cette classe à la place
  • Comment empêcher une barre de navigation inférieure d'être poussée sur le clavier
  • Supprimer l'espace entre TextViews empilés
  • Comment passer des valeurs de tableau vers et depuis Android RenderScript à l'aide de Allocations
  • Plusieurs fichiers dex définissent Lcom / google / android / gms / internal / zzau
  • Android Emulator Plugin sur Jenkins - Comment étendre le délai d'attente?
  • 3 Solutions collect form web for “Pourquoi InsertHelper était-il obsolète?”

    InsertHelper permet aux utilisateurs de faire des insertions multiples dans une table en utilisant la même instruction. Mais ce n'est pas un bon moyen d'insertion comme tel, car il n'est not thread-safe .

    Il est difficile de trouver des informations sur la façon dont InsertHelper a été déconseillé sans passer à l'engagement réel qui le déprécie. L'ingénieur qui a obsolète InsertHelper a donné la raison suivante:

    Cette classe n'offre aucun avantage sur SQLiteStatement et rend le code plus complexe et plus propice aux erreurs.

    Après avoir répondu depuis InsertHelper vers SQLiteStatement, je suis d'accord. Une exception concerne les fonctions de liaison nulles. Alors que InsertHelper appelle automatiquement bindNull () pour vous, SQLiteStatement se bloque si vous passez, par exemple, une chaîne nulle et vous devez faire votre propre vérification nulle avant d'appeler bindString ().

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

    Vous devez utiliser les transactions. . Si vous ne créez pas explicitement une transaction pour une opération de base de données, la structure crée une pour chaque. Groupez votre objet ensemble et insérez-les tous à la fois. Cela augmentera considérablement les performances.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.