我想在後臺線程中運行我的內容解析器操作(查詢,插入,刪除)。AsyncQueryHandler批量插入
我發現了AsyncQueryHandler可以解決我的問題。 AsyncQueryHandler的問題是:批量插入。我在我的應用程序中有這種操作,並且在AsyncQueryHandler類中沒有要覆蓋的bulkInsert方法。
我在處理AsyncQueryHandler時如何處理批量插入?除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://stackoverflow.com/questions/11131058/how-to-properly-insert-values-into-the-sqlite-database-using-contentproviders-i –
我見過這個答案。這些人告訴使用「getContentResolver()。insert(Uri,ContentValues);」。問題是:這種插入進入主線程UI。我需要在後臺線程上插入。 –