我创建了自己的内容提供者,我使用多个插入一次放入大量数据。
应用程序将从外部源接收数据,此时我收到约30项(因此插入30次)。
现在我注意到这需要花费很多宝贵的时间(每次插入约3秒,100毫秒)。
如何提高contentprovider的速度?我已经尝试将它们全部拼接在一起,但它们最多需要5秒钟。
提前致谢。
答案 0 :(得分:21)
将insertBulk
中的所有内容包装到交易中。
示例:
SQLiteDatabase sqlDB = mDB.getWritableDatabase();
sqlDB.beginTransaction();
try {
for (ContentValues cv : values) {
long newID = sqlDB.insertOrThrow(table, null, cv);
if (newID <= 0) {
throw new SQLException("Failed to insert row into " + uri);
}
}
sqlDB.setTransactionSuccessful();
getContext().getContentResolver().notifyChange(uri, null);
numInserted = values.length;
} finally {
sqlDB.endTransaction();
}
bulkInsert
默认情况下不使用事务,因为默认行为只调用insert
:
重写此方法以处理插入一组新行的请求,或者默认实现将迭代值并在每个值上调用insert(Uri,ContentValues)。
答案 1 :(得分:3)
在事务中执行插入可以大大提高速度,因为只有一次写入actuall数据库:
db.beginTransaction();
try {
// do the inserts
db.setTransactionSuccessful()
} finally {
db.endTransaction();
}
我曾经试图提高大约2000次写入的写入速度,这是我发现的唯一重大改进。
执行db.setLockingEnabled(false)
我认为提供了大约1%的改进,但是您还必须确保没有其他线程写入数据库。如果表格很大,删除冗余索引也可以略微提升。