¿Cuál es el mecanismo de setNotificationUri?
Acabo de implementar un CursorLoader y funciona muy bien! De hecho, no creí que mi ListView actualizaría automáticamente cuando los datos subyacentes cambiaran hasta que lo probé. Esto aparentemente es la magia de setNotificationUri.
Mi pregunta es, ¿cómo sabe cuando los datos en el cursor ha cambiado? Decir que en silencio insertar una fila adicional en alguna parte. ¿El mecanismo subyacente consulta constantemente la base de datos y la compara con los datos anteriores? ¿No será horriblemente ineficiente si los conjuntos de datos son grandes?
- Android Spinner Artículo seleccionado
- ¿Cómo cierro el Cursor y la Base de datos de forma segura?
- Valores de salida encontrados en el cursor a logcat? - Android
- Cursor SQLLiteDataBase de Android que devuelve 0 filas
- No se pudo asignar CursorWindow
Antes de utilizar cursorloaders, actualizaría manualmente cuando fuera necesario. Es genial que no tenga que hacer esto más, pero es eficiente dejar que el CursorLoader a esto en el fondo?
- Android cómo consultar enorme base de datos en android (tamaño del cursor está limitado a 1 MB)
- Escuchar cualquier cambio en un cursor en android
- Android cursor.moveToNext ()?
- ¿Por qué mi Cursor no está cerrado en una actividad de Android?
- Android.database.CursorIndexOutOfBoundsException: Índice 0 solicitado, con un tamaño de 0
- Cambio de cursor en CursorAdapter
- Lista de Android todas las imágenes disponibles
Por favor, corrija si estoy equivocado en alguna parte.
ContentProvider
llama a algo como esto en el método de query(…)
:
// Tell the cursor what uri to watch, so it knows when its source data changes cursor.setNotificationUri(getContext().getContentResolver(), uri);
CursorLoader
recupera el cursor y registra un observador.
/* Runs on a worker thread */ @Override public Cursor loadInBackground() { Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection, mSelectionArgs, mSortOrder); if (cursor != null) { // Ensure the cursor window is filled cursor.getCount(); registerContentObserver(cursor, mObserver); } return cursor; } /** * Registers an observer to get notifications from the content provider * when the cursor needs to be refreshed. */ void registerContentObserver(Cursor cursor, ContentObserver observer) { cursor.registerContentObserver(mObserver); }
Cuando alguien modifica datos, ContentProvider
notifica a ContentResolver
sobre los cambios:
getContext().getContentResolver().notifyChange(uri, null);
ContentResolver
a su vez notifica a todos los observadores registrados.
Observer, registrado por CursorLoader
, lo obliga a cargar nuevos datos.