2012-10-05 35 views
11

我選擇了greenDAO,因爲它的網站聲明它是Android最快的ORM系統之一。對我而言,需要40秒才能在三星i9001上插入600條記錄。我不確定我是否做錯了什麼。greenDAO 40秒插入600條記錄

你能否建議任何事情來減少執行這些操作所花費的時間?

生成代碼:

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

插入

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

回答

36

正如我懷疑事情不是一個單一的SQL語句內執行。爲了實現它,只需在DAO對象上使用insertInTx。

這裏是略有改動,使其運行在像上面的代碼一半的DaoSession.runInTx函數內第二

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

你3年前救了我的屁股。 – Youtoo

+0

我證明了我的數據庫的負載(從01:30分到〜1秒)。非常感謝!。 – VIX

9

你也可以創建一個新的Runnable做所有刀片運行

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

這裏給出一篇關於加速Android的SQLITE插入操作的優秀文章。 試用一下我可以在同步39MB數據庫的同時,將同步模塊的速度從1.2小時優化到14分鐘。

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

讓我知道的情況下,如果你需要的代碼spinnets。

+0

這是一篇很好的文章,但是greenDAO已經對使用事務進行了優化。用戶午夜的答案是最好的。 –

0

我試着下面提到並獲得最佳的性能

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

     dbGreen.beginTransaction(); 

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