3

我有大约 7000 行要插入到设备的(Android Galaxy tab2)sqlite 数据库中。目前我正在解析 JSON 文件并使用“for”循环将行插入数据库。但是将数据解析和插入到 sqlite 数据库需要 120 多秒。有没有其他更快的方法来做到这一点?

谢谢...

4

2 回答 2

1

我遇到了完全相同的情况。首先,我使用的是 DatabaseUtil.insertHelper,600 个条目花了我 +30 秒的时间。

我做了更多的挖掘,发现我插入的每一行都被提交了,这非常昂贵。

为了解决这个问题,我切换到ORMLite,使用 insertAll 方法:

/**
* Inserts multiple objects into the database quickly by committing them all at once
*
* @param objects The objects to insert
*/
public void insertAll(final T[] objects) {
    try {
        dao.callBatchTasks(new Callable<Void>() {

        @Override
        public Void call() throws Exception {
            for (T object : objects) {
                dao.create(object);
            }
            return null;    
        }
        });
    } catch (Exception e) {
    AdbLogger.error("Error inserting new " + className + "s in the database");
}
}

这里的想法是他们插入对象数组,然后最后只做一个大提交。在此切换之后,插入变得几乎是瞬间的。

于 2013-04-18T17:58:51.637 回答
1

你应该使用statements

database.beginTransaction();
SQLiteStatement stmt = database.compileStatement(sql);

for (int i = 0; i < NUMBER_OF_ROWS; i++) {
    //generate some values

    stmt.bindString(1, randomName);
    stmt.bindString(2, randomDescription);
    stmt.bindDouble(3, randomPrice);
    stmt.bindLong(4, randomNumber);

    long entryID = stmt.executeInsert();
    stmt.clearBindings();
}

database.setTransactionSuccessful();
database.endTransaction();

参考

这里是另外一个链接,其中给出了这两种插入方法之间的比较。(对于 100 条记录,正常插入需要 1657 毫秒,而语句endTransaction()需要 92 毫秒)

于 2015-12-16T04:53:14.407 回答