web-dev-qa-db-fra.com

CursorLoader ne se met pas à jour après la modification des données

J'ai créé une petite application, essayant de comprendre les fonctionnalités des classes LoaderManager et CursorLoader-.

J'ai implémenté LoaderCallbacks<Cursor> Sur ma classe FragmentActivity- et tout fonctionne bien, sauf que lorsque je mets à jour mes données via ContentResolver.update() ou ContentResolver.insert()- méthodes, onLoadFinished() n'est pas appelée et par conséquent mes données ne sont pas mises à jour.

J'ai un ContentProvider personnalisé et je me demande si le problème vient de mon ContentProvider qui ne notifie pas que les données ont changé ou autre chose.

49
akalipetis

Avez-vous appelé setNotificationUri(ContentResolver cr, Uri uri) sur le Cursor avant de le renvoyer dans ContentProvider.query()?

Et avez-vous appelé getContext().getContentResolver().notifyChange(uri, null) dans la méthode 'insert' de votre ContentProvider?

ÉDITER:

Pour obtenir un ContentResolver appelez getContext().getContentResolver() dans votre ContentProvider.

105
thaussma

Vérifiez également si vous appelez quelque part cursor.close (), car dans ce cas, vous annulez l'observateur de contenu qui a été enregistré par CursorLoader. Et la fermeture du curseur est gérée par CursorLoader.

4
ultraon

La réponse acceptée était un peu difficile à comprendre, donc j'écris la réponse pour la rendre facile pour les autres développeurs.

  1. Accédez à la classe dans laquelle vous avez étendu le ContentProvider
  2. Recherchez la méthode query () qui a la syntaxe suivante

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

  3. Écrivez cette ligne où vous retournez le curseur

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

Au final, ma méthode de requête ressemble à ceci

@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