loadercallbacks android android-contentprovider android-cursorloader android-loadermanager

android - loadercallbacks



CursorLoader no se actualiza después del cambio de datos (3)

¿ setNotificationUri(ContentResolver cr, Uri uri) a setNotificationUri(ContentResolver cr, Uri uri) en el Cursor antes de devolverlo en ContentProvider.query() ?

¿Y llamó a getContext().getContentResolver().notifyChange(uri, null) en el método ''insertar'' de su ContentProvider ?

EDITAR:

Para obtener un ContentResolver llame a getContext().getContentResolver() en su ContentProvider .

He creado una pequeña aplicación, tratando de entender la funcionalidad de LoaderManager y CursorLoader -classes.

He implementado LoaderCallbacks<Cursor> en mi clase FragmentActivity y todo funciona bien, excepto el hecho de que cuando actualizo mis datos a través de ContentResolver.update() o ContentResolver.insert() onLoadFinished() , onLoadFinished() no se llama como resultado mis datos no se actualizan.

Tengo un ContentProvider personalizado y me pregunto si el problema está en mi ContentProvider sin notificar que los datos cambiaron o algo más.


La respuesta aceptada fue un poco difícil de entender, así que estoy escribiendo la respuesta para facilitar la tarea a otros desarrolladores.

  1. Vaya a la clase en la que ha ampliado el ContentProvider
  2. Encuentre el método query () que tiene la siguiente sintaxis

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

  3. Escriba esta línea donde está regresando el cursor

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

Al final, mi método de consulta se ve así

@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; }`


También verifique si llama a algún lugar cursor.close (), porque en este caso anula el registro del observador de contenido registrado por CursorLoader. Y el cierre del cursor está gestionado por CursorLoader.