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é
- ¿Soporta Android JDBC?
- Android MediaStore obtiene distintas carpetas de archivos de música
- Almacenar Android SQLite
- ¿Cómo mostrar los datos de la base de datos en un RecyclerView con alto rendimiento?
- Cierre del cursor en onPostExecute no produce nada
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
- Android SQLiteAssetHelper No se puede actualizar la base de datos de sólo lectura de la versión 1 a 2:
- Cómo cargar más de 1 MB de datos desde sqlite db al cursor de Android?
- ¿Qué es la tabla android_metadata?
- GetWritableDatabase () VS getReadableDatabase ()
- SQLiteDatabase transacción anidada y solución alternativa
- Solicitud de SQL con el caso en orden por tiros "(1) primer término ORDER BY no coincide con ninguna columna en el conjunto de resultados"
- Pasar los datos a otro fragmento de vista de desplazamiento con la pestaña de estudio de Android, no botón
- ¿Cómo puedo reiniciar la ID de incremento automático desde 1 en una base de datos SQLite de Android
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