greenDAO 40秒插入600条记录

mid*_*ght 14 android greendao

我选择了greenDAO,因为它的网站声称它是Android上最快的ORM系统之一.对于我的失望,它需要40秒才能在三星i9001上插入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();
}
Run Code Online (Sandbox Code Playgroud)

插入

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);
}
Run Code Online (Sandbox Code Playgroud)

mid*_*ght 41

因为我怀疑事情没有在单个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);
Run Code Online (Sandbox Code Playgroud)

  • 你在3年前救了我的屁股. (4认同)

the*_*osh 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);
        }
   }
});
Run Code Online (Sandbox Code Playgroud)