AsyncQueryHandler批量插入
我想在后台线程中运行我的内容解析器操作(查询,插入,删除)。AsyncQueryHandler批量插入
我发现了AsyncQueryHandler可以解决我的问题。 AsyncQueryHandler的问题是:批量插入。我在我的应用程序中有这种操作,并且在AsyncQueryHandler类中没有要覆盖的bulkInsert方法。
我在处理AsyncQueryHandler时如何处理批量插入?除AsyncQueryHandler之外是否还有其他选项?
在一天结束的时候,我改变了我的架构。
我删除了bulkInsert并对内容值数组进行了一次讨论。这样我就可以使用AsyncQueryHandler而没有问题。
经过思考和思考,我认为这对我来说是最好的选择。
嘿,你可以在这种情况下使用CursorLoader。这将查询内容解析器并返回一个游标。它使用AsyncTaskLoader在后台线程上执行游标查询,以便它不会阻塞应用程序的UI。 你可以看看http://www.theappguruz.com/blog/use-android-cursorloader-example了解更多详情。
而且你可以定义批量插入方法到您的内容提供商,如下面
@Override
public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
//mOpenHelper is object of helper class.
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
db.beginTransaction();
int rowsInserted = 0;
try {
for (ContentValues value : values) {
long _id = db.insert(TABLE_NAME, null, value);
if (_id != -1) {
rowsInserted++;
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
if (rowsInserted > 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
return rowsInserted;
}
AsyncQueryHandler
不支持bulkInsert
可能是因为此方法不能保证插入的原子性。这是什么意思?那么,如果startInsert
由于某种原因失败,那么没有插入完成。这意味着您可以进行无插入操作或进行一次插入操作。只有2个选项。保持原子性,即如果失败,则基础数据源保持与以前相同。
如果bulkInsert
中的10个项目由于某种原因应该在中间失败,可以有很多选项:插入3个项目或插入5个项目。因此没有原子性。当ContentProvider
不覆盖bulkInsert
并最终多次使用隐含的insert
时会发生这种情况。因此,插入每个项目后,交易将被视为成功并提交。这意味着对于10个项目,发生10个事务,并且如果任何一个发生故障,则不会回滚到数据源的先前状态。操作的原子性丢失。
但这是不好的。如果您拥有ContentProvider
并且您已覆盖bulkInsert
并确保保持原子性,该怎么办?那么你应该可以使用AsyncQueryHandler
执行bulkInsert
。 https://github.com/Madrapps/AsyncQuery库确实如此。这是Android的相同AsyncQueryHandler
,但支持bulkInsert
。
只要确保你使用自己的ContentProvider
,如果你关心原子性,那么它可以处理bulkInsert
。
CursorLoader的问题是当我需要进行插入和删除操作时。我无法将它用于这些操作。 –
你可以参考这个链接了解更多详情http://*.com/questions/11131058/how-to-properly-insert-values-into-the-sqlite-database-using-contentproviders-i –
我见过这个答案。这些人告诉使用“getContentResolver()。insert(Uri,ContentValues);”。问题是:这种插入进入主线程UI。我需要在后台线程上插入。 –