Android contentprovider insert需要花费大量时间

时间:2011-12-01 14:44:59

标签: android sql insert android-contentprovider

我创建了自己的内容提供者,我使用多个插入一次放入大量数据。

应用程序将从外部源接收数据,此时我收到约30项(因此插入30次)。

现在我注意到这需要花费很多宝贵的时间(每次插入约3秒,100毫秒)。

如何提高contentprovider的速度?我已经尝试将它们全部拼接在一起,但它们最多需要5秒钟。

提前致谢。

2 个答案:

答案 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%的改进,但是您还必须确保没有其他线程写入数据库。如果表格很大,删除冗余索引也可以略微提升。