12

我花了很长时间查看我们设备上的一些性能问题,并注意到我们有很多应用程序都在执行数据库读/写..

我首先使用 Contacts API 插入新的联系人和数据行,但速度非常慢。1 分 18 秒插入大约 1500 行(250 个原始联系人和 1250 个数据行)..

我曾在另一个应用程序中使用插入助手进行性能插入,并决定编写一个测试应用程序,该应用程序将写入单独的数据库和单独的插入方法。

每个数据库都有一个表,每个表有 4 列:_ID、名称、时间和 Blob(所有类型为“字符串”)——就像联系人提供者定义数据列一样。

_ID 是自动增量 pk,Name 只是插入相同的东西 '1234567890',time 是当前系统时间,单位是 milis,BLob 是一个长度为 6400 的字符串,其中包含字母 'A'...

我首先检查了批量插入,但它所做的只是循环遍历您定义的所有插入,并且与单独执行插入一样慢(或对性能的影响可以忽略不计)..

我测试了 3 种不同的插入方法:ContentValues w/db.insert 方法:SQLiteStatement w/statement.execute()(在事务中完成)。带有事务的 SqliteInsertHelper。

我可以提供一些代码,但我从 InsertHelper 中获得了最佳性能,并且想知道为什么它被弃用了:

插入 100 条记录的时间 ContentValues:7.778 秒(写入 82 字节/毫秒) SQLiteStatement:1.311 秒(写入 489 字节/毫秒) SqliteInsertHElper:0.292 秒(写入 2197 字节/毫秒)

有任何想法吗?

4

3 回答 3

7

很难得到任何关于为什么 InsertHelper 被弃用的信息,而不去实际的提交确实弃用它。弃用 InsertHelper 的工程师给出了以下原因:

这个类与 SQLiteStatement 相比没有任何优势,只是使代码更复杂和更容易出错。

从 InsertHelper 重构为 SQLiteStatement 后,我​​同意。一个例外是 null 安全绑定函数。虽然 InsertHelper 会自动为您调用 bindNull(),但如果您传递一个空字符串,SQLiteStatement 会崩溃,并且您必须在调用 bindString() 之前进行自己的空值检查。

见: https ://android.googlesource.com/platform/frameworks/base/+/b33eb4e%5E!/

于 2015-10-09T23:45:53.207 回答
0

InsertHelper 允许用户使用相同的语句对表进行多次插入。但这并不是插入的好方法not thread-safe

于 2013-10-31T05:35:33.697 回答
0

你应该使用事务。. 如果您没有为数据库操作显式创建事务,则框架会为每个操作创建一个。将您的对象组合在一起并一次将它们全部插入。这将大大提高性能。

于 2014-05-23T07:26:21.797 回答