Ste*_*v_k 8 sqlite android transactions ormlite
任何人都可以解释为什么我的插页在Ormlite中花了这么长时间?在桌面上的一个sqlite事务中执行1,700次插入只需不到一秒钟.但是,当使用Ormlite for Android时,它需要大约70秒,我可以在调试消息中看到每个插入.
当我尝试将插入包装到一个事务中时,它以完全相同的速度运行.我知道Android和Ormlite都有开销,但是,我不希望它那么棒.我的代码如下:
this.db = new DatabaseHelper(getApplicationContext());
dao = db.getAddressDao();
final BufferedReader reader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.poi)));
try {
dao.callBatchTasks(new Callable<Void>() {
public Void call() throws Exception {
String line;
while ((line = reader.readLine()) != null) {
String[] columns = line.split(",");
Address address = new Address();
// setup Address
dao.create(address);
}
return null;
}
});
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*hov 11
我遇到了同样的问题,并找到了合理的解决方法.插入时间从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();
}
Run Code Online (Sandbox Code Playgroud)
更新:
刚刚在Xperia M2 Aqua(Android4.4/ARM)上进行了测试,callBatchTasks()实际上速度更快.90毫秒vs 120毫秒.所以我认为更多的细节是有序的.
我们有3个表/类/ DAO:Parent,ChildWrapper,Child.
关系:父到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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在特定的Android4.2/MIPS机顶盒(STB)上加速了原创速度.
callBatchTasks是第一个选项,因为这是我们使用的所有代码,它运作良好.
parentDao.callBatchTasks(
// ...
saveData();
// ...
);
Run Code Online (Sandbox Code Playgroud)
但插入速度很慢,所以我们试图callBatchTasks为每个使用过的DAO设置嵌套,设置autocommit off,startThreadConnection以及其他可能的东西 - 此刻不记得了.无济于事.
根据我自己的经验和其他类似的帖子,似乎问题出现在涉及多个表/ DAO时,它与具体设备的Android(或SQLite)的实现细节有关.
不幸的是,这可能是“预期的”。当我在模拟器下执行相同数量的插入时,我也获得了类似的性能。批处理任务和关闭自动提交似乎没有帮助。
如果您希望将大量数据加载到数据库中,则可以考虑重播数据库转储。看这里:
| 归档时间: |
|
| 查看次数: |
8234 次 |
| 最近记录: |