我选择了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();
}
插入
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);
}
答案 0 :(得分:39)
我怀疑事情没有在单个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);
答案 1 :(得分: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);
}
}
});
答案 2 :(得分:1)
这里给出了一篇关于加速Android的SQLITE插入操作的优秀文章。 试用这个我可以在同步39MB DB的情况下将同步模块的速度从1.2小时大幅提升到14分钟。
http://tech.vg.no/2011/04/04/speeding-up-sqlite-insert-operations/
如果您需要代码spinnet,请告诉我。
答案 3 :(得分:0)
我尝试过以下提到并获得最佳性能
DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "db-name",
null);
SQLiteDatabase dbGreen= helper.getWritableDatabase();
dbGreen.beginTransaction();
//Perform your insertion here
dbGreen.setTransactionSuccessful();
dbGreen.endTransaction();