greenDAO插入600条记录需要40秒钟。

14

我选择了greenDAO,因为它的网站声称它是Android上最快的ORM系统之一。但令我失望的是,在三星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个回答

42

正如我所怀疑的那样,这些事情并没有在单个SQL语句中执行。为了实现这一点,只需在DAO对象上使用insertInTx。

以下是稍作更改后可以在半秒钟内运行的代码:

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

4
你在3年前救了我的命。 - Youtoo
我证明了我的数据库的负载(从01:30分钟到约1秒)。 非常感谢!。 - VIX

9

你也可以创建一个新的Runnable,在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

这是一篇很棒的文章,但greenDAO已经针对使用交易进行了优化。用户midnight的回答是最好的。 - Austin B

0

我尝试了下面提到的方法,获得了最佳性能。

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

        dbGreen.beginTransaction();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接