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.

¿Fue útil?

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():

  1. 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 llanura Cursor, pero ahora se hace debajo del capó.
  2. CursorLoader se actualiza automáticamente. Además de realizar la consulta inicial, el CursorLoader registra un ContentObserver con el conjunto de datos que solicitó y llama forceLoad() en sí mismo cuando cambia el conjunto de datos. Esto da como resultado que se obtenga async 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top