14

私が greenDAO を選択したのは、それが Android 向けの最速の ORM システムの 1 つであるとサイトに記載されているためです。残念なことに、Samsung i9001 で 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);
}
4

4 に答える 4

42

As I suspected things weren't executed within a single sql statement. In order to achieve it just use insertInTx on a DAO object.

Here's the above code with slight changes that make it run in like half a second

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);
于 2012-10-07T14:08:14.500 に答える
9

DaoSession.runInTx関数内ですべての挿入を実行する新しい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);
        }
   }
});
于 2012-11-07T09:53:20.297 に答える
1

Android の SQLITE 挿入操作の高速化に関する優れた記事がここにあります。これを試してみると、39MB DB の同期で同期モジュールの速度を 1.2 時間から 14 分に劇的に最適化できました。

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

コード スピネットが必要な場合はお知らせください。

于 2013-04-06T08:50:08.973 に答える
0

以下を試してみたところ、最高のパフォーマンスが得られました

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

        dbGreen.beginTransaction();

        //Perform your insertion here
        dbGreen.setTransactionSuccessful();
        dbGreen.endTransaction();
于 2015-03-28T12:11:31.813 に答える