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

4 回答 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);
于 2012-10-07T14:08:14.500 回答
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);
        }
   }
});
于 2012-11-07T09:53:20.297 回答
1

这里给出了一篇关于加速 Android 的 SQLITE 插入操作的优秀文章。试用这个,我可以在同步 39MB 数据库时将同步模块的速度从 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 回答