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
SQLiteDatabase
cuando el contenido cambie, y de alguna manera puede transmitir estas notificaciones a todos losLoader
existentes en su aplicación. Escribí una publicación de blog bastante extensa sobre cómo implementarLoader
s que podría ser útil si desea asumir este desafío. O...Use la biblioteca
LoaderEx
Mark Murphy y solo realice modificaciones en la base de datos utilizando las operacionesAsyncTask
proporciona su biblioteca. Tenga en cuenta que la razón por la cual sus tareas actualizan elLoader
es porque llaman aonContentChanged
en elLoader
inmediatamente después de que se realiza la inserción / actualización / eliminación, indicando efectivamente alLoader
que el contenido ha cambiado y que debe actualizar sus datos.Simplemente use un
ContentProvider
con unCursorLoader
y puede usar elContentResolver#notifyChange()
para notificar alCursorLoader
que 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.