49

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

-classに実装LoaderCallbacks<Cursor>しましたが、または-methodsを介してデータを更新すると呼び出されず、その結果データが更新されないというFragmentActivity事実を除いて、すべてが正常に機能します。ContentResolver.update()ContentResolver.insert()onLoadFinished()

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

4

3 に答える 3

106

返却する前に電話setNotificationUri(ContentResolver cr, Uri uri)しましたか?CursorContentProvider.query()

getContext().getContentResolver().notifyChange(uri, null)そして、あなたはあなたの「挿入」メソッドを呼び出しましたContentProviderか?

編集:

ContentResolverで電話getContext().getContentResolver()を受けるにはContentProvider

于 2011-10-27T11:18:38.323 に答える
5

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

于 2016-09-28T11:49:21.463 に答える
4

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

  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;
}`
于 2017-02-22T12:01:43.497 に答える