2012-10-05 6 views
11

Ich habe greenDAO gewählt, weil es auf der Website heißt, dass es eines der schnellsten ORM-Systeme für Android ist. Zu meiner Enttäuschung dauert es etwa 40 Sekunden, um 600 Platten auf Samsung i9001 einzufügen. Ich bin mir nicht sicher, ob ich irgendetwas falsch mache.greenDAO 40 Sekunden zum Einfügen 600 Datensätze

Können Sie etwas vorschlagen, um die Zeit zu verkürzen, die für diese Operationen benötigt wird?

Generator Code:

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(); 
} 

Einfügungen

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); 
} 

Antwort

36

Wie ich die Dinge Verdacht nicht innerhalb einer einzigen SQL-Anweisung ausgeführt wurden. Um dies zu erreichen, verwenden Sie einfach insertTx für ein DAO-Objekt.

Hier ist der obige Code mit leichten Veränderungen, die es wie die Hälfte laufen in machen einen zweiten

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

Sie meinen Arsch vor in 3 Jahren gespeichert. – Youtoo

+0

Ich beweise die Belastung meiner Datenbank (von 01:30 min bis ~ 1s). Vielen Dank!. – VIX

9

Sie auch eine neue Runnable erstellen können, die alle Einsätze tut läuft innerhalb der DaoSession.runInTx Funktion

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

Ein ausgezeichneter Artikel über die Beschleunigung von SQLITE-Einfügeoperationen für Android wird hier gegeben. Probieren Sie es aus, ich könnte die Sync-Module dramatisch von 1,2 Stunden auf 14 Minuten bei der Synchronisierung von 39 MB DB zu optimieren.

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

mich bei wissen lassen, wenn Sie Code spinnets benötigen.

+0

Das ist ein ausgezeichneter Artikel, aber greenDAO hat bereits Optimierungen für die Verwendung von Transaktionen. Die Antwort von Usernacht ist die beste. –

0

Ich habe versucht, unten erwähnt und bekam die beste Leistung

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

     dbGreen.beginTransaction(); 

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