我花了很长时间在我们的设备上查看一些性能问题,并注意到我们有很多应用程序都在进行数据库读/写..
我开始使用Contacts API插入新的联系人&数据行,它很慢。 1分18秒插入约1500行(250个原始触点和1250个数据行)..
我曾在另一个应用程序中使用插入助手进行性能插入,并决定编写一个测试应用程序,该应用程序将写入单独的数据库w /单独的插入方法。
每个数据库都有一个表,每个表有4个列: _ID,Name,Time和Blob(所有类型'string') - 就像联系提供者定义数据列一样。
_ID是自动增量pk,Name只是插入相同的东西'1234567890',时间只是当前系统时间的milis,而BLob是一个字符串,长度为6400,字母'A'......
我首先检查了批量插入,但它所做的只是循环遍历您定义的所有插入,并且与单独插入(或可忽略的性能影响)一样慢。
我测试了3种不同的方法来进行插入: ContentValues w / db.insert方法: SQLiteStatement w / statement.execute()(在事务内部完成)。 SqliteInsertHelper w / transaction。
我可以提供一些代码,但是我从InsertHelper中获得了最佳性能,并想知道为什么它被弃用了:
插入100条记录的时间 ContentValues:7.778秒(写入82字节/ ms) SQLiteStatement:1.311秒(写入489字节/毫秒) SqliteInsertHElper:0.292秒(写入2197字节/ ms)
有什么想法吗?
答案 0 :(得分:5)
很难得到关于为何不推荐使用InsertHelper的信息,而没有进行实际的弃用操作。不推荐使用InsertHelper的工程师提供了以下原因:
这个类与SQLiteStatement相比没有任何优势,只会使代码更复杂,容易出错。
从InsertHelper重构为SQLiteStatement之后,我同意。一个例外是null安全绑定函数。尽管InsertHelper会自动为您调用bindNull(),但是如果您传递了SQLiteStatement,则会崩溃,例如,在调用bindString()之前必须执行自己的null检查。
请参阅: https://android.googlesource.com/platform/frameworks/base/+/b33eb4e%5E!/
答案 1 :(得分:0)
您应该使用transactions.。如果您没有为数据库操作显式创建事务,则框架会为每个操作创建一个事务。将您的对象组合在一起并立即插入它们。这将大大提高性能。