Android – CursorLoader y SQLite sin proveedor de contenido
Sé que esto se ha discutido todavía quisiera preguntar sobre el estado actual de la materia. ¿Tengo que crear un ContentProvider para utilizar CursorLoader en conexión con una base de datos sqlite?
encontré
- Cómo implementar herencia de tabla en GreenDao
- SQLite dispara en Android?
- Cómo eliminar la base de datos en la aplicación para Android
- ¿Por qué utilizar sqlite Database en Android?
- Función de actualización en android SQLite no funciona
Uso de CursorLoader sin ContentProvider
Parece exactamente lo que yo esperaba todavía como Emmby comentó
- Los usuarios deben ser conscientes de una limitación, que es que no tiene ningún mecanismo para actualizar los cambios de datos (como se supone que los cargadores de hacer)
Así que se menciona otra solución
Https://github.com/commonsguy/cwac-loaderex
Nuevamente se señala algún inconveniente
- Sin embargo, para hacer uso de la re-interrogación automática, es necesario utilizar el mismo cargador para la interfaz de usuario, así como para las actualizaciones, lo que limita su usabilidad para los servicios de fondo.
Por supuesto, al usar LoaderManager queremos obtener todos los beneficios para los que fue introducido. Así que mi pregunta es si hay una manera de usar LoaderManager en relación con una base de datos sqlite sin tener que implementar un proveedor de contenido sin embargo, tienen todos los beneficios de la misma.
Gracias
- Consulta de actualización de base de datos SQLite con múltiples condiciones de ubicación en Android
- Android.database.sqlite.SQLiteException: Token no reconocido:
- Cifrar la base de datos sqlite Android:
- ¿Cómo veo la base de datos SQLite en un dispositivo Android?
- La aplicación se bloquea al actualizar la base de datos sqlite por primera vez
- ¿Cuál es la forma correcta de hacer inserciones / actualizaciones / eliminaciones en Android SQLiteDatabase utilizando una cadena de consulta?
- ¿Cuál es la ventaja de usar SQLite en lugar de File?
- Cursor finalizado sin cerrar antes () en ListFragment
Las dos implementaciones que menciona en su publicación ofrecen todas las ventajas del CursorLoader
excepto la capacidad de recibir notificaciones cuando cambia el contenido subyacente.
He estado buscando en esto mucho recientemente y puedo decirle con confianza que la API de Android actualmente no proporciona un medio de hacer esto con sólo un raw SQLiteDatabase
(sólo proporciona el ContentResolver#notifyChange()
y Cursor#setNotificationUri()
Métodos, que se utilizan para notificar a todos los Cursor
registrados bajo una determinada notificación Uri
).
Dicho esto, ahora sus opciones son:
-
Implementar un observador usted mismo que es capaz de recibir notificaciones de
SQLiteDatabase
cuando el contenido cambia, y es de alguna manera capaz de retransmitir estas notificaciones a todos losLoader
existentes en su aplicación. Escribí una extensa publicación en el blog sobre cómo implementarLoader
s que podría resultar útil si deseas enfrentarte a este desafío. O… -
Utilice la biblioteca
LoaderEx
Mark Murphy y sólo realice modificaciones en la base de datos utilizando las operacionesAsyncTask
proporciona su biblioteca. Tenga en cuenta que la razón por la que sus tareas actualizan elLoader
es porque llamanonContentChanged
enLoader
inmediatamente después de que se realiza la inserción / actualización / supresión, diciéndole alLoader
que el contenido ha cambiado y que debe actualizar sus datos. -
Sólo utilice un
ContentProvider
con unCursorLoader
y puede utilizar elContentResolver#notifyChange()
para notificar alCursorLoader
que se ha producido un cambio de contenido.
Estoy tratando de encontrar una mejor solución, y voy a informar en el futuro si alguna vez encontrar / implementar una, pero por ahora tendrán que hacer.
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);
- Cómo evitar que el bloqueador de anuncios bloquee anuncios en una aplicación
- Cómo utilizar ADB en Android Studio para ver una base de datos SQLite