web-dev-qa-db-ja.com

データ変更後にCursorLoaderが更新されない

LoaderManagerクラスとCursorLoaderクラスの機能を理解しようとして、小さなアプリケーションを作成しました。

FragmentActivity-クラスに_LoaderCallbacks<Cursor>_を実装しましたが、ContentResolver.update()またはContentResolver.insert()- methodsを使用してデータを更新する場合を除き、すべて正常に動作します、onLoadFinished()は呼び出されず、その結果、データは更新されません。

私はカスタムContentProviderを持っていますが、データが変更されたことなどを通知していないContentProviderに問題があるのではないかと思っています。

49
akalipetis

setNotificationUri(ContentResolver cr, Uri uri)で返す前に、CursorContentProvider.query()を呼び出しましたか?

ContentProviderの 'insert'メソッドでgetContext().getContentResolver().notifyChange(uri, null)を呼び出しましたか?

編集:

ContentResolverを取得するには、ContentProvidergetContext().getContentResolver()を呼び出します。

105
thaussma

また、CursorLoaderによって登録されたコンテンツオブザーバの登録を解除するため、どこかでcursor.close()を呼び出すかどうかも確認してください。また、カーソルのクローズはCursorLoaderによって管理されます。

4
ultraon

受け入れられた答えは理解するのが少し難しいので、他の開発者が簡単に使えるように答えを書いています。

  1. ContentProviderを拡張したクラスに移動します
  2. 次の構文を持つquery()メソッドを見つけます

    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

  3. カーソルを戻す場所にこの行を書きます

    cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor;

最後に、クエリメソッドは次のようになります

@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

    Cursor cursor;
    cursor = noticeDbHelper.getReadableDatabase().query(
            NoticeContract.NoticeTable.TABLE_NAME,
            projection,
            selection,
            selectionArgs,
            null,
            null,
            sortOrder
    );
    //This line will let CursorLoader know about any data change on "uri" , So that data will be reloaded to CursorLoader
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
}`
3
Manish Menaria