tutorial - android-CursorLoader y SQLite sin proveedor de contenido
tablas android studio (2)
Sé que esto ya se discutió, pero quería preguntar sobre el estado actual de la cuestión. ¿Debo crear un ContentProvider para usar CursorLoader en conexión con una base de datos sqlite?
encontré
Uso de CursorLoader sin ContentProvider
Se ve exactamente lo que esperaba todavía, como comentó Emmby
- Los usuarios deben tener en cuenta una limitación, que es que no tiene un mecanismo para actualizar los cambios de datos (como se supone que deben hacer los cargadores).
Entonces, se menciona otra solución
https://github.com/commonsguy/cwac-loaderex
una vez más, se señala un inconveniente
- Sin embargo, para hacer uso de la nueva consulta automática, debe usar el mismo cargador para la interfaz de usuario y para las actualizaciones, lo que limita su uso para los servicios en segundo plano.
Por supuesto, al usar LoaderManager queremos obtener todos los beneficios para los que fue introducido. Así que mi pregunta es si hay una forma de usar LoaderManager en conexión con una base de datos sqlite sin tener que implementar un proveedor de contenido pero que tenga todas las ventajas.
Gracias
Aquí está mi solución, en mi onCreateLoader
{
Uri u = Uri.parse("content://what_string_you_want");
return new CursorLoader(this, yourURI, projection, null, null, null) {
private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
@Override
public Cursor loadInBackground() {
Cursor c = YOUR_DATABASE.doYourQuery(...);
if (c != null) {
// Ensure the cursor window is filled
c.getCount();
c.registerContentObserver(mObserver);
}
c.setNotificationUri(getContext().getContentResolver(), getUri());
return c;
}
};
}
Después del código que cambiará DB, agregue
getContentResolver().notifyChange(
Uri.parse("content://same_with_first_string"), null);
Las dos implementaciones que menciona en su publicación ofrecen todos los beneficios de CursorLoader excepto la posibilidad de recibir notificaciones cuando cambia el contenido subyacente.
He estado investigando esto mucho recientemente y puedo decir con confianza que la API de Android actualmente no proporciona un medio de hacerlo con solo una base de datos SQLiteDatabase sin SQLiteDatabase (solo proporciona ContentResolver#notifyChange() y Cursor#setNotificationUri() métodos, que se utilizan para notificar a todos los Cursor registrados bajo una cierta notificación Uri ).
Dicho eso, tus opciones ahora son:
Implemente un observador que sea capaz de recibir notificaciones de
SQLiteDatabasecuando el contenido cambie, y de alguna manera puede transmitir estas notificaciones a todos losLoaderexistentes en su aplicación. Escribí una publicación de blog bastante extensa sobre cómo implementarLoaders que podría ser útil si desea asumir este desafío. O...Use la biblioteca
LoaderExMark Murphy y solo realice modificaciones en la base de datos utilizando las operacionesAsyncTaskproporciona su biblioteca. Tenga en cuenta que la razón por la cual sus tareas actualizan elLoaderes porque llaman aonContentChangeden elLoaderinmediatamente después de que se realiza la inserción / actualización / eliminación, indicando efectivamente alLoaderque el contenido ha cambiado y que debe actualizar sus datos.Simplemente use un
ContentProvidercon unCursorLoadery puede usar elContentResolver#notifyChange()para notificar alCursorLoaderque se ha producido un cambio de contenido.
Estoy tratando de encontrar una solución mejor, e informaré en el futuro si alguna vez encuentro / implemento una, pero por ahora tendrán que hacerlo.