Inserti bulk Android di Ormlite

qualcuno può spiegare perché i miei inserti stanno prendendo così tanto tempo in Ormlite? Fare 1.700 inserti in una transazione sqlite sul desktop richiede less di un secondo. Tuttavia, quando si utilizza Ormlite per Android, occorrono circa 70 secondi e posso vedere each inserto nei messaggi di debug.

Quando cerco di avvolgere gli inserti in un'unica transazione, va esattamente la stessa velocità. Capisco che ci sia overhead sia per Android che per Ormlite, comunque, non mi aspetto che sia così grande. Il mio codice è qui sotto:

  • Come faccio a vedere la fonte o il javadocs per una dipendenza dalla libreria in un pacchetto Android in Eclipse?
  • EditText sta perdendo l'input degli utenti quando ruota il telefono Android
  • Come simulare il comportmento di tre fasi della lastra di Google Maps?
  • Come disattivo la connessione Internet in Android Emulator?
  • Programmaticamente modificare Manifest - autorizzazioni personalizzate di Android
  • Come posso albind un file di image in posta elettronica?
  • this.db = new DatabaseHelper(getApplicationContext()); dao = db.getAddressDao(); final BufferedReader reader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.poi))); try { dao.callBatchTasks(new Callable<Void>() { public Void call() throws Exception { String line; while ((line = reader.readLine()) != null) { String[] columns = line.split(","); Address address = new Address(); // setup Address dao.create(address); } return null; } }); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } 

  • Android N richiede che l'IDE sia in esecuzione con Java 1.8 o versione successiva?
  • Come autenticare un'applicazione mobile senza username e password?
  • Come posso impostare la mia applicazione su un dispositivo rooted?
  • Qualcosa di simile a Cocoa Pods e Bundler per Android (per dependencies)?
  • Decodifica file da SdCard android per evitare errori di memory dovuti a grandi bitmap o setImageURI
  • Android Come posso call Camera o Galleria Intent Insieme
  • 3 Solutions collect form web for “Inserti bulk Android di Ormlite”

    Purtroppo, questo può essere "previsto". Ottengo performance simili quando faccio quel numero di inserti anche sotto il mio emulatore. Le attività batch e la distriggerszione del commit automatico non sembrano aiutare.

    Se stai cercando di caricare una grande quantità di dati in un database, puoi considerare di riprodurre invece un dump di database. Vedere qui:

    Android OrmLite pre-popola il database

    Ho avuto lo stesso problema, e ho trovato una soluzione ragionevole. Questo ha impiegato il tempo di inserimento da 2 secondi a 150 ms:

     final OrmLiteSqliteOpenHelper myDbHelper = ...; final SQLiteDatabase db = myDbHelper.getWritableDatabase(); db.beginTransaction(); try{ // do ormlite stuff as usual, no callBatchTasks() needed db.setTransactionSuccessful(); } finally { db.endTransaction(); } 

    Aggiornare:

    Basta testare questo su Xperia M2 Aqua (Android4.4 / ARM) e callBatchTasks() è in realtà più veloce . 90ms vs 120ms. Penso quindi che più dettagli siano in ordine.

    Abbiamo 3 tavoli / classi / DAO: Genitore, ChildWrapper, Child.
    Relazioni: Genitore a ChildWrapper – da 1 a n, ChildWrapper a Child – n a 1.
    Il codice va come questo:

     void saveData(xml){ for (parents in xml){ parentDao.createOrUpdate(parent); for (children in parentXml){ childDao.createOrUpdate(child); childWrapperDao.createOrUpdate(generateWrapper(parent, child)); } } } 

    Ho accelerato originale su uno specifico set-top-box (STB) Android4.2 / MIPS. callBatchTasks stata la prima opzione perché questo è ciò che usiamo attraverso tutto il codice e funziona bene.

     parentDao.callBatchTasks( // ... saveData(); // ... ); 

    Ma gli inserti sono stati lenti, quindi abbiamo cercato di nidificare callBatchTasks per each DAO utilizzato, impostare l'autocommit off, startThreadConnection e probabilmente qualcos'altro – non ricordo in questo momento. Inutilmente.

    Dalla mia esperienza e da altri post simili sembra che il problema si verifica quando sono coinvolti diversi tavoli / DAO e ha qualcosa a che fare con le specifiche di implementazione di Android (o SQLite) per i dispositivi concreti.

    La mia ipotesi sarebbe che stai rallentando un po 'perché stai facendo due operazioni IO in una sola volta (alless nel codice mostrato in precedenza). Stai leggendo da un file e scrivendo a un database (che è un file). Inoltre, da quello che capisco le transactions dovrebbero essere una dimensione ragionevole. 1600 sembra un numero molto elevato. Vorrei iniziare con 100 ma giocare con le size.

    Quindi, in sostanza, vi suggerisco di "tagliare" le tue letture e gli inserti.

    Leggete 100 righe ad un temp Array, quindi inserite quello 100. Leggere poi il successivo 100, poi inserire, ecc.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.