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

AsyncQueryHandlerbulkInsertはおそらくこのメソッドが挿入のアトミック性を保証しないため、bulkInsertをサポートしていません。これは何を意味するのでしょうか?さて、何らかの理由でstartInsertが失敗した場合、挿入は行われません。つまり、「挿入しない」または「挿入した」のいずれかを持つことができます。 2つのオプションしかありません。アトミシティは維持される。すなわち、失敗した場合、基礎となるデータソースは以前と同じままである。

何らかの理由で10項目のうちbulkInsertが途中で失敗する場合は、3つの項目が挿入されるか、5つの項目が挿入されることがあります。したがって、原子性はありません。これは、ContentProviderbulkInsertをオーバーライドせず、暗黙的にinsertを複数回使用して終了したときに発生します。したがって、各項目が挿入された後、トランザクションは成功したとみなされ、コミットされます。これは、10個のアイテムについて10個のトランザクションが発生し、いずれかに障害が発生した場合、データソースの前の状態にロールバックしないことを意味します。操作のアトミック性が失われます。

しかし、これは悪いです。 ContentProviderを所有していて、bulkInsertをオーバーライドし、アトミック性が維持されていることを確認したらどうでしょうか?次にAsyncQueryHandlerを使用してbulkInsertを実行できるはずです。 https://github.com/Madrapps/AsyncQueryライブラリはそれを正確に行います。 AndroidのAsyncQueryHandlerと同じですが、bulkInsertをサポートしています。

アトミック性が懸念される場合は、を使用してbulkInsertを処理できることを確認してください。

関連する問題