2013-03-08 5 views
12

Ho passato un po 'di tempo a esaminare alcuni problemi di prestazioni sul nostro dispositivo e ho notato che abbiamo un bel po' di app che eseguono db in lettura/scrittura ..Perché InsertHelper è stato deprecato?

Ho iniziato utilizzando l'API Contatti per inserire nuovi contatti & righe di dati, ed era dolorosamente lento. 1 minuto 18 secondi per inserire circa 1500 righe (250 contatti prime & 1250 righe di dati) ..

che avevo usato l'aiutante di inserimento in un'altra app per inserti di performance, e ha deciso di scrivere un applicazione di test che scrivere a DB separati w/metodi di inserimento separati.

Ogni db ha una tabella, ognuna con 4 colonne: _ID, Nome, Ora e Blob (tutto il tipo 'stringa') - proprio come il fornitore di contatti definisce le colonne di dati.

_ID è incremento automatico pk, Nome inserisce proprio la stessa cosa '1234567890', il tempo è giusto il tempo di sistema corrente a Milis, e Blob è una stringa w/lunghezza 6400 integrale della lettera 'A' ...

ho controllato l'inserimento di massa, ma non fa altro che scorre tutti gli inserti che avete definito, ed è altrettanto lento come fare gli inserti singolarmente (o impatto trascurabile performance) ..

ho provato 3 diversi metodi per fare gli inserti: ContentValues ​​con il metodo db.insert: SQLiteStatement w/statement.execute() (fatto all'interno di una transazione). SqliteInsertHelper con transazione.

posso fornire un codice, ma ho avuto le migliori prestazioni del InsertHelper, e si chiede perché è stata sconsigliata:

tempo per inserire 100 record contentValues: 7.778 secondi (82 byte scritti/ms) SQLiteStatement: 1.311 secondi (489 byte scritti/ms) SqliteInsertHElper: 0,292 secondi (2197 byte scritti/ms)

Qualche idea?

+0

Ho fatto qualche prova supplementare, e ha fatto un inserto regolare, ma ha reso parte di una transazione, questo ha migliorato le prestazioni notevolmente. Sembra che un certo codice sia probabilmente necessario da cedere (guardando il fornitore di contatti). – Chrispix

+0

Dato il problema di prestazioni che hai menzionato, le transazioni sarebbero state il mio primo suggerimento (ogni transazione richiede l'attesa di andata e ritorno dell'IO, ogni inserimento al di fuori di una transazione è implicitamente racchiuso in uno). Passato, potrebbe essere utile leggere: http://stackoverflow.com/questions/14344172/android-bulk-insert-when-inserthelper-is-deprecated – rutter

+0

Avrei anche suggerito le transazioni. Gli inserti che ho testato con le transazioni sono stati abbastanza veloci. – Luis

risposta

0

InsertHelper consente agli utenti di eseguire più inserimenti in una tabella utilizzando la stessa istruzione.Ma non è un buon modo per inserire come tale è not thread-safe.

+3

in base a http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html, la raccomandazione alternativa non è protetta da thread sia –

0

È necessario utilizzare transactions.. Se non si crea esplicitamente una transazione per un'operazione di database, il framework ne crea uno per ciascuno. Raggruppa insieme il tuo oggetto e inseriscili tutti in una volta. Ciò aumenterà notevolmente le prestazioni.

4

È difficile trovare informazioni sul motivo per cui InsertHelper è stato dichiarato obsoleto senza passare al commit effettivo che lo depreca. L'ingegnere che deprecato InsertHelper ha dato il seguente motivo:

Questa classe non offre vantaggi rispetto SQLiteStatement e solo rende il codice più complesso e soggetto a errori.

Dopo il refactoring da InsertHelper a SQLiteStatement sono d'accordo. Un'eccezione riguarda le funzioni di associazione a sicurezza nulla. Considerando che InsertHelper chiama automaticamente bindNull() per te, SQLiteStatement si arresta in modo anomalo se si passa, ad esempio, una stringa nullo e si deve eseguire il proprio controllo Null prima di chiamare bindString().

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

+0

In corso di attivazione per accedere al registro di commit per ottenere la risposta autorevole. Ti darei di più se potessi. – Dalbergia