如何有效地使用ormlite在android sqlite数据库中插入批量数据

时间:2013-07-03 19:14:52

标签: android sqlite android-sqlite ormlite

我正在尝试一次在android sqlite数据库中插入100000条记录。我正在使用以下两种不同的方法。

 private void bulkInsertDataBySavePoint(final List<User> users) {
    log.debug("bulkInsertDataBySavePoint()");
    DatabaseConnection conn = null;
    Savepoint savepoint = null;
    try {
        conn = userDao.startThreadConnection();
        savepoint = conn.setSavePoint("bulk_insert");
        for (User user : users) {
            userDao.create(user);
        }
    } catch (SQLException e) {
        log.error("Something went wrong in bulk Insert", e);
    } finally {
        if (conn != null) {
            try {
                conn.commit(savepoint);
                userDao.endThreadConnection(conn);
            } catch (SQLException e) {
                log.error("Something went wrong in bulk Insert", e);
            }
        }
    }
}

并且

   private void bulkInsertDataByCallBatchTasks(final List<User> users) {
    log.debug("bulkInsertDataByCallBatchTasks()");
    try {
        userDao.callBatchTasks(new Callable<Void>() {
            @Override
            public Void call() throws Exception {
                for (User user : users) {
                    userDao.create(user);
                }
                return null;
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

两种方法都可以正常工作。平均而言,他们需要140秒才能占用60-65%的CPU,这是不行的。

我的想法是,我必须使用一个能提供json数据的api。我必须解析该json数据,然后插入sqlite数据库以供离线使用。

我正在寻找一种有效的方法来解决这个问题。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

  

我试图一次在android sqlite数据库中插入100000条记录...平均而言,它们占用140秒并占用60-65%的CPU,这在我看来是不行的。

不幸的是,我没有一个简单的答案。您可能必须使用原始SQL直接执行此类插入,以在有限的Android CPU上实现更快的性能。插入数据后,您可以转到ORMLite以更快地查询或操作数据。

答案 1 :(得分:3)

我遇到了同样的问题,并找到了合理的解决方法。插入时间从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();
}

答案 2 :(得分:1)

  

槽糕。好主意@FarrukhNajmi。我刚把它添加到主干。它将在4.49版本中。

@Gray它还不稳定吗?我们什么时候可以在maven中看到它?

如果com.j256.ormlite.dao.ForeignCollection #addAll只做一个请求也会很好。