2012-10-05 4 views
11

私はgreenDAOを選んだのは、それがアンドロイドの最速のORMシステムの1つであるというサイトの状態だからです。私のdissapointmentには、Samsung i9001に600レコードを挿入するのに40秒かかるのです。私が何か悪いことをしているかどうかは分かりません。greenDAO 600レコードを挿入するのに40秒

これらの操作を実行するのにかかる時間を短縮するために何か提案することはできますか?

ジェネレータコード:

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を使用するだけです。

は、ここでそれのようで走らせるわずかな変化で、上記のコードです半分あなたはまた、すべての挿入を行い、新規のRunnableを作成することができます

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

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

Android用のSQLite挿入操作のスピードアップに関する優れた記事がここにあります。 これを試してみてください39MBのDBを同期させるには、同期モジュールの速度を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(); 
関連する問題