LoaderManager
クラスとCursorLoader
クラスの機能を理解しようとして、小さなアプリケーションを作成しました。
FragmentActivity
-クラスに_LoaderCallbacks<Cursor>
_を実装しましたが、ContentResolver.update()
またはContentResolver.insert()
- methodsを使用してデータを更新する場合を除き、すべて正常に動作します、onLoadFinished()
は呼び出されず、その結果、データは更新されません。
私はカスタムContentProviderを持っていますが、データが変更されたことなどを通知していないContentProviderに問題があるのではないかと思っています。
setNotificationUri(ContentResolver cr, Uri uri)
で返す前に、Cursor
でContentProvider.query()
を呼び出しましたか?
ContentProvider
の 'insert'メソッドでgetContext().getContentResolver().notifyChange(uri, null)
を呼び出しましたか?
編集:
ContentResolver
を取得するには、ContentProvider
でgetContext().getContentResolver()
を呼び出します。
また、CursorLoaderによって登録されたコンテンツオブザーバの登録を解除するため、どこかでcursor.close()を呼び出すかどうかも確認してください。また、カーソルのクローズはCursorLoaderによって管理されます。
受け入れられた答えは理解するのが少し難しいので、他の開発者が簡単に使えるように答えを書いています。
ContentProvider
を拡張したクラスに移動します次の構文を持つquery()メソッドを見つけます
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
カーソルを戻す場所にこの行を書きます
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;
}`