Ormlite Android批量插入

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)的实现细节有关.


Gra*_*ray 3

不幸的是,这可能是“预期的”。当我在模拟器下执行相同数量的插入时,我也获得了类似的性能。批处理任务和关闭自动提交似乎没有帮助。

如果您希望将大量数据加载到数据库中,则可以考虑重播数据库转储。看这里:

Android OrmLite 预填充数据库