2012-10-05 16 views
11

Ho scelto greenDAO perché il sito dichiara che è uno dei sistemi ORM più veloci per Android. Per il mio disappunto ci vogliono 40 secondi per inserire 600 record su Samsung i9001. Non sono sicuro se sto facendo qualcosa di sbagliato.greenDAO 40 secondi per inserire 600 record

Puoi suggerire qualcosa per ridurre la quantità di tempo necessario per eseguire tali operazioni?

Generatore di codice:

private static void addNewsArticle(Schema schema) { 
    Entity article = schema.addEntity("NewsArticle"); 
    article.addIdProperty().autoincrement(); 
    article.addStringProperty("title").notNull(); 
    article.addStringProperty("body").notNull(); 
    article.addStringProperty("shortDescription").notNull(); 
    article.addStringProperty("thumb"); 
    article.addDateProperty("date").notNull(); 
} 

inserimenti

Date now = Calendar.getInstance().getTime(); 
for (int i = 0; i < 600; i++) { 
    NewsArticle testArticle = new NewsArticle(); 
    testArticle.setTitle("title-text" + i); 
    testArticle.setBody("body-text" + i); 
    testArticle.setShortDescription("short-text" + i); 
    testArticle.setDate(now); 
    newsArticleDao.insert(testArticle); 
} 

risposta

36

Come sospettavo le cose non sono stati eseguiti all'interno di una singola istruzione SQL. Per realizzarlo basta usare insertInTx su un oggetto DAO.

Ecco il codice di cui sopra, con lievi modifiche che lo rendono eseguito in come mezzo secondo

NewsArticle[] newsArticles = new NewsArticle[600]; 
NewsArticle testArticle; 
    for (int i = 0; i < 600; i++) { 
     testArticle = new NewsArticle(); 
     testArticle.setTitle("title-text" + i); 
     testArticle.setBody("body-text" + i); 
     testArticle.setShortDescription("short-text" + i); 
     testArticle.setDate(now); 
     newsArticles[i] = testArticle; 
    } 
newsArticleDao.insertInTx(newsArticles); 
+3

salvato il culo in 3 anni prima. – Youtoo

+0

Provo il caricamento del mio database (da 01:30 min a ~ 1s). Grazie mille!. – VIX

9

è anche possibile creare un nuovo Runnable che fa tutti gli inserti corre all'interno della funzione DaoSession.runInTx

daoSession.runInTx(new Runnable { 
    public void run(){ 
     Date now = Calendar.getInstance().getTime(); 
     for (int i = 0; i < 600; i++) { 
      NewsArticle testArticle = new NewsArticle(); 
        testArticle.setTitle("title-text" + i); 
        testArticle.setBody("body-text" + i); 
        tesArticle.setShortDescription("short-text" + i); 
        testArticle.setDate(now); 
        newsArticleDao.insert(testArticle); 
     } 
    } 
}); 
1

Qui viene fornito un eccellente articolo sull'accelerazione delle operazioni di inserimento SQLITE per Android. Prova questo potrei ottimizzare la velocità dei moduli di sincronizzazione in modo drammatico da 1,2 ore a 14 minuti sincronizzando 39 MB di DB.

http://tech.vg.no/2011/04/04/speeding-up-sqlite-insert-operations/

Fammi sapere nel caso in cui se avete bisogno spinnets codice.

+0

Questo è un articolo eccellente, ma greenDAO ha già ottimizzazioni per l'utilizzo delle transazioni. La risposta dell'utente mezzanotte è la migliore. –

0

Ho provato sotto indicati ed ha ottenuto la migliore prestazione

 DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "db-name", 
       null); 
     SQLiteDatabase dbGreen= helper.getWritableDatabase(); 

     dbGreen.beginTransaction(); 

     //Perform your insertion here 
     dbGreen.setTransactionSuccessful(); 
     dbGreen.endTransaction(); 
Problemi correlati