La documentación del SDK de Android dice que el startManagingCursor()
método está depravado:
Este método está en desuso. Utilice la nueva clase CursorLoader con LoaderManager en su lugar; esto también está disponible en plataformas más antiguas a través del paquete de compatibilidad de Android. Este método permite que la actividad se encargue de administrar el ciclo de vida del Cursor dado por usted en función del ciclo de vida de la actividad. Es decir, cuando la actividad se detiene, llamará automáticamente a deactivate () en el Cursor dado, y cuando se reinicie más tarde, llamará a requery () por usted. Cuando se destruye la actividad, todos los cursores administrados se cerrarán automáticamente. Si está apuntando a HONEYCOMB o posterior, considere usar LoaderManager en su lugar, disponible a través de getLoaderManager ()
Entonces me gustaría usar CursorLoader
. Pero, ¿cómo puedo usarlo con personalizado CursorAdapter
y sin ContentProvider
, cuando necesito URI en el constructor de CursorLoader
?
Respuestas:
Escribí un CursorLoader simple que no necesita un proveedor de contenido:
Solo necesita la
AsyncTaskLoader
clase. O el de Android 3.0 o superior, o el que viene con el paquete de compatibilidad.También escribí un
ListLoader
que es compatible conLoadManager
y se usa para recuperar unajava.util.List
colección genérica .fuente
Escriba su propio cargador que use su clase de base de datos en lugar de un proveedor de contenido. La forma más fácil es simplemente tomar la fuente de la
CursorLoader
clase de la biblioteca de compatibilidad y reemplazar las consultas del proveedor con consultas a su propia clase auxiliar de base de datos.fuente
CursorLoader
descendiente para administrar un cursor SQLite, además del constructor, solo necesitaba anular elloadInBackground
método para reemplazar la consulta del proveedor con mi consulta del cursorSimpleCursorLoader es una solución simple, sin embargo, no admite la actualización del cargador cuando cambian los datos. CommonsWare tiene una biblioteca loaderex que agrega un SQLiteCursorLoader y admite volver a consultar los cambios de datos.
https://github.com/commonsguy/cwac-loaderex
fuente
Una tercera opción sería simplemente anular
loadInBackground
:Esto también se encargará de volver a consultar su cursor cuando cambie la base de datos.
Solo advertencia: tendrá que definir a otro observador, ya que Google, en su sabiduría infinita, decidió hacer privado el paquete de ellos. Si pones la clase en el mismo paquete que el original (o el compatible), puedes usar el observador original. El observador es un objeto muy liviano y no se usa en ningún otro lugar, por lo que esto no hace mucha diferencia.
fuente
loadInBackground()
, antes de devolver el cursor, diga quecursor.setNotificationUri(getContext().getContentResolver(), uri);
el uri puede ser simplemente de una cadena aleatoria comoUri.parse("content://query_slot1")
. Parece que no le importa que los uri realmente existan o no. Y una vez que hice la operación en DB. SaygetContentResolver().notifyChange(uri, null);
haría el truco. Entonces puedo crear algunas "consultas uri slot" en un archivo contante para la aplicación con un pequeño número de consultas. Probé la inserción del registro DB en tiempo de ejecución y parece que funciona, pero todavía dudo que sea una buena práctica. ¿Cualquier sugerencia?La tercera opción propuesta por Timo Ohr, junto con los comentarios de Yeung, proporcionan la respuesta más simple (navaja de Occam). A continuación se muestra un ejemplo de una clase completa que me funciona. Hay dos reglas para usar esta clase.
Cada vez que cambie la base de datos subyacente (por ejemplo, después de una inserción o eliminación), asegúrese de llamar
donde myUri es el mismo devuelto por su implementación del método getContentUri ().
Aquí está el código de la clase que utilicé:
fuente