我遇到了同样的问题,并找到了合理的解决方法。插入时间从 2 秒缩短到 150 毫秒:
final OrmLiteSqliteOpenHelper myDbHelper = ...;
final SQLiteDatabase db = myDbHelper.getWritableDatabase();
db.beginTransaction();
try{
// do ormlite stuff as usual, no callBatchTasks() needed
db.setTransactionSuccessful();
}
finally {
db.endTransaction();
}
Update:
刚刚在 Xperia M2 Aqua (Android4.4/ARM) 上进行了测试,callBatchTasks()
实际上是faster。 90 毫秒与 120 毫秒。所以我认为更多细节是必要的。
我们有 3 个表/类/DAO:Parent、ChildWrapper、Child。
关系:Parent 到 ChildWrapper - 1 到 n,ChildWrapper 到 Child - n 到 1。
代码如下:
void saveData(xml){
for (parents in xml){
parentDao.createOrUpdate(parent);
for (children in parentXml){
childDao.createOrUpdate(child);
childWrapperDao.createOrUpdate(generateWrapper(parent, child));
}
}
}
我在特定的 Android4.2/MIPS 机顶盒 (STB) 上获得了原始加速。callBatchTasks
是第一个选项,因为我们在所有代码中都使用它,并且效果很好。
parentDao.callBatchTasks(
// ...
saveData();
// ...
);
但插入速度很慢,所以我们尝试嵌套callBatchTasks
对于每个使用过的 DAO,设置自动提交关闭、startThreadConnection 以及可能的其他内容 - 目前不记得了。无济于事。
从我自己的经验和其他类似的帖子来看,当涉及多个表/DAO 时,似乎会出现问题,并且它与具体设备的 Android(或 SQLite)的实现细节有关。