2012-10-05 14 views
11

Sitenin, android için en hızlı ORM sistemlerinden biri olduğunu belirtmesi nedeniyle greenDAO'u seçtim. Benim dissapointment için Samsung i9001 üzerinde 600 kayıt eklemek için 40 saniye gibi alır. Yanlış bir şey yapıyorum emin değilim.greenDAO 600 kayıt eklemek için 40 saniye

Bu işlemleri gerçekleştirmek için gereken süreyi azaltmak için herhangi bir şey önerebilir misiniz?

jeneratör kodu:

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

eklemeleri

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

cevap

36

Her şeyin tek bir sql ifadesi içinde infaz edilmedi şüpheli olarak. Bunu başarmak için sadece bir DAO nesnesi üzerinde insertInTx kullanın.

Burada gibi çalıştırmak yapmak ufak değişiklik dışında yukarıda kod yarısı da tüm ekler yapan yeni Runnable oluşturabilir

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

önce 3 yıl içinde beni kurtardı got çalıştı. – Youtoo

+0

Veritabanımın yükünü kanıtladım (01:30 dk'dan ~ 1s'e). Çok teşekkürler!. – VIX

9

ikinci DaoSession.runInTx işlev içinde çalışan bir

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 için SQLIT ekleme işlemlerini hızlandırmak için mükemmel bir makale burada verilmiştir. Bunu deneyin Deneme modülleri hızını, 39MB DB'yi senkronize ederek 1,2 saatten 14 dakikaya kadar optimize edebilirim.

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

kod spinnets ihtiyacınız olursa bana durumda bildirin.

+0

Bu mükemmel bir yazıdır, ancak greenDAO zaten işlemleri kullanmak için optimizasyonlara sahiptir. Kullanıcı gece yarısı yanıtı en iyisidir. –

0

aşağıda belirtilen ve en iyi performansı

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

     dbGreen.beginTransaction(); 

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