¿Debe realizar una actividad o fragmento un cargador separado para el tipo de operación de la base de datos?
Pregunta
Parece que la forma recomendada por Google (usando la biblioteca de soporte de Android) para un fragmento o actividad para interactuar con una base de datos SQLite es a través de un cargador que extiende AsyncTaskLoader y funciona de manera similar a la forma en que CursorLoader lo hace para ContentProviders.
Una sola actividad o fragmento puede interactuar con una base de datos de varias maneras, actualización, eliminación y consulta de datos en una o más tablas. Pero dado que un cargador solo tiene un lugar para llevar a cabo la manipulación de la base de datos (es decir loadInBackground()
), es el desarrollador que se espera que escriba un cargador separado para cada tipo de interacción, especialmente porque parece la única forma de parametrizar el comportamiento en loadInBackground()
es pasando argumentos al constructor del cargador a través del args
argumentar LoaderManager.initLoader()
?
Muchas gracias.
Solución
Cuando no usa un ContentProvider
, es decir, cuando se usa SQLite directamente, usa AsyncTaskLoader
Si el conjunto de operaciones de base de datos que se realizará devuelve un Cursor
. El conjunto puede incluir cualquier tipo de operación: actualización, consulta, eliminar, insertar. Estas operaciones deben ejecutarse en AsyncTaskLoader.loadInBackground()
.
Si el conjunto de operaciones de la base de datos no da como resultado un Cursor
siendo devuelto, use un AsyncTask
. En este caso, las operaciones deben ejecutarse en AsyncTask.doInBackground()
.
Otros consejos
Hay dos beneficios clave para usar un CursorLoader
En tu aplicación sobre Activity.managedQuery():
- La consulta se maneja en un hilo de fondo para usted (cortesía de ser construido sobre
AsyncTaskLoader)
Por lo tanto, las grandes consultas de datos no bloquean la interfaz de usuario. Esto es algo que los documentos recomendaron que hicieras por ti mismo cuando usas una llanuraCursor
, pero ahora se hace debajo del capó. CursorLoader
se actualiza automáticamente. Además de realizar la consulta inicial, el CursorLoader registra unContentObserver
con el conjunto de datos que solicitó y llamaforceLoad()
en sí mismo cuando cambia el conjunto de datos. Esto da como resultado que se obtengaasync
devoluciones de llamada cada vez que los datos cambian para actualizar la vista.
Cada instancia del cargador también se maneja a través del singular LoaderManager
, por lo que aún no tiene que administrar el cursor directamente, y ahora la conexión puede persistir incluso más allá de un solo Activity. LoaderManager.initLoader()
y LoaderManager.restartLoader()
Permitirle reconectarse con un cargador existente ya configurado para su consulta y, en algunos casos, obtener instantáneamente los últimos datos si está disponible.
Su actividad o fragmento probablemente implementará ahora el LoaderManager
. Interfaz de retroceso. Vocación initLoader()
dará como resultado el método OnCreateLoader () donde construirá la consulta y una nueva CursorLoader
instancia, si es necesario. los onLoadFinished()
El método se disparará cada vez que haya nuevos datos disponibles, e incluirá el último cursor para que se adjunte a la vista o de otra manera iterar.
Además, hay un buen ejemplo de todo este ajuste en el LoaderManager
Página de documentación de clase: http://developer.android.com/reference/android/app/loadermanager.html
¡Espero que ayude!
Según las respuestas anteriores, no estoy seguro de si esto es lo que está preguntando exactamente. Pero sí, debe hacer un cargador con su ID único para cada conjunto de datos, es decir, cada tipo de consulta que realice.