我正在尝试一次在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数据库以供离线使用。
我正在寻找一种有效的方法来解决这个问题。
有什么想法吗?
答案 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只做一个请求也会很好。