1

我想在後臺線程中運行我的內容解析器操作(查詢,插入,刪除)。AsyncQueryHandler批量插入

我發現了AsyncQueryHandler可以解決我的問題。 AsyncQueryHandler的問題是:批量插入。我在我的應用程序中有這種操作,並且在AsyncQueryHandler類中沒有要覆蓋的bulkInsert方法。

我在處理AsyncQueryHandler時如何處理批量插入?除AsyncQueryHandler之外是否還有其他選項?

回答

0

在一天結束的時候,我改變了我的架構。

我刪除了bulkInsert並對內容值數組進行了一次討論。這樣我就可以使用AsyncQueryHandler而沒有問題。

經過思考和思考,我認爲這對我來說是最好的選擇。

1

嘿,你可以在這種情況下使用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; 


} 
+0

CursorLoader的問題是當我需要進行插入和刪除操作時。我無法將它用於這些操作。 –

+0

你可以參考這個鏈接瞭解更多詳情http://stackoverflow.com/questions/11131058/how-to-properly-insert-values-into-the-sqlite-database-using-contentproviders-i –

+0

我見過這個答案。這些人告訴使用「getContentResolver()。insert(Uri,ContentValues);」。問題是:這種插入進入主線程UI。我需要在後臺線程上插入。 –

0

AsyncQueryHandler不支持bulkInsert可能是因爲此方法不能保證插入的原子性。這是什麼意思?那麼,如果startInsert由於某種原因失敗,那麼沒有插入完成。這意味着您可以進行無插入操作或進行一次插入操作。只有2個選項。保持原子性,即如果失敗,則基礎數據源保持與以前相同。

如果bulkInsert中的10個項目由於某種原因應該在中間失敗,可以有很多選項:插入3個項目或插入5個項目。因此沒有原子性。當ContentProvider不覆蓋bulkInsert並最終多次使用隱含的insert時會發生這種情況。因此,插入每個項目後,交易將被視爲成功並提交。這意味着對於10個項目,發生10個事務,並且如果任何一個發生故障,則不會回滾到數據源的先前狀態。操作的原子性丟失。

但這是不好的。如果您擁有ContentProvider並且您已覆蓋bulkInsert並確保保持原子性,該怎麼辦?那麼你應該可以使用AsyncQueryHandler執行bulkInserthttps://github.com/Madrapps/AsyncQuery庫確實如此。這是Android的相同AsyncQueryHandler,但支持bulkInsert

只要確保你使用自己的ContentProvider,如果你關心原子性,那麼它可以處理bulkInsert