Android SQLite数据库:插入缓慢



Answers

由于Yuku和Brett提到的InsertHelper现在已经被deprecated (API级别17),似乎Google推荐的正确选择是使用SQLiteStatement

我使用这样的数据库插入方法:

database.insert(table, null, values);

在我遇到一些严重的性能问题后,下面的代码加快了我的500插入从14.5秒增加到仅270毫秒 ,太棒了!

以下是我如何使用SQLiteStatement:

private void insertTestData() {
    String sql = "insert into producttable (name, description, price, stock_available) values (?, ?, ?, ?);";

    dbHandler.getWritableDatabase();
    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();

    dbHandler.close();
}
Question

我需要解析一个相当大的XML文件(大约在一百千字节和几百千字节之间),我使用Xml#parse(String, ContentHandler) 。 我目前正在用一个152KB的文件来测试它。

在解析过程中,我还使用类似于以下的调用将数据插入到SQLite数据库中: getWritableDatabase().insert(TABLE_NAME, "_id", values) _ getWritableDatabase().insert(TABLE_NAME, "_id", values) 。 所有这些在一起大约需要80秒,用于152KB的测试文件(可以插入大约200行)。

当我注释掉所有插入语句(但是在其他所有内容中,例如创建ContentValues等)时,同一个文件只需要23秒。

数据库操作有这么大的开销是否正常? 我能做些什么吗?




如果表上有一个索引,请考虑在插入记录之前将其删除,然后在提交记录后再将其添加回来。




Links