我需要解析一个相当大的XML文件(大约在一百千字节和几百千字节之间变化),我正在使用 Xml#parse(String, ContentHandler)
. 我目前正在使用152KB文件进行测试 .
在解析期间,我还使用类似于以下的调用将数据插入SQLite数据库: getWritableDatabase().insert(TABLE_NAME, "_id", values)
. 对于152KB的测试文件(大约插入200行),所有这一切大约需要80秒 .
当我注释掉所有插入语句(但留下其他所有内容,例如创建 ContentValues
等)时,同一个文件只需要23秒 .
数据库操作有这么大的开销是正常的吗?我可以做点什么吗?
5 回答
你应该进行批量插入 .
伪代码:
这极大地提高了我的应用程序中的插入速度 .
更新:
@Yuku提供了一篇非常有趣的博文:Android using inserthelper for faster insertions into sqlite database
由于Yuku和Brett提到的InsertHelper现在为deprecated(API等级为17),因此Google推荐的正确选择似乎是使用 SQLiteStatement .
我使用了这样的数据库插入方法:
在我遇到一些严重的性能问题之后,以下代码将我的500个插入从 14.5 sec 加速到仅仅 270 ms ,太棒了!
以下是我使用SQLiteStatement的方法:
编译sql insert语句有助于加快速度 . 它还需要更多的努力来支撑一切并防止可能的注射,因为它现在都在你的肩上 .
另一种可以加快速度的方法是文档不足的android.database.DatabaseUtils.InsertHelper类 . 我的理解是它实际上包装了编译的insert语句 . 从非编译的事务处理插入到编译的事务处理插件,对于我的大型(200K条目)但简单的SQLite插入,速度增加了3倍(每个插入2ms到每插入0.6ms) .
示例代码:
如果表上有索引,请考虑在插入记录之前删除它,然后在提交记录后将其添加回来 .
如果使用ContentProvider:
然后执行插入的私有函数(仍然在您的内容提供者中):