volley tutorial tablas studio servicios programacion hermosa espaƱol content consultas android sqlite android-contentprovider android-loadermanager

tutorial - android-CursorLoader y SQLite sin proveedor de contenido



tablas android studio (2)

Sé que esto ya se discutió, pero quería preguntar sobre el estado actual de la cuestión. ¿Debo crear un ContentProvider para usar CursorLoader en conexión con una base de datos sqlite?

encontré

Uso de CursorLoader sin ContentProvider

Se ve exactamente lo que esperaba todavía, como comentó Emmby

  • Los usuarios deben tener en cuenta una limitación, que es que no tiene un mecanismo para actualizar los cambios de datos (como se supone que deben hacer los cargadores).

Entonces, se menciona otra solución

https://github.com/commonsguy/cwac-loaderex

una vez más, se señala un inconveniente

  • Sin embargo, para hacer uso de la nueva consulta automática, debe usar el mismo cargador para la interfaz de usuario y para las actualizaciones, lo que limita su uso para los servicios en segundo plano.

Por supuesto, al usar LoaderManager queremos obtener todos los beneficios para los que fue introducido. Así que mi pregunta es si hay una forma de usar LoaderManager en conexión con una base de datos sqlite sin tener que implementar un proveedor de contenido pero que tenga todas las ventajas.

Gracias


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);


Las dos implementaciones que menciona en su publicación ofrecen todos los beneficios de CursorLoader excepto la posibilidad de recibir notificaciones cuando cambia el contenido subyacente.

He estado investigando esto mucho recientemente y puedo decir con confianza que la API de Android actualmente no proporciona un medio de hacerlo con solo una base de datos SQLiteDatabase sin SQLiteDatabase (solo proporciona ContentResolver#notifyChange() y Cursor#setNotificationUri() métodos, que se utilizan para notificar a todos los Cursor registrados bajo una cierta notificación Uri ).

Dicho eso, tus opciones ahora son:

  1. Implemente un observador que sea capaz de recibir notificaciones de SQLiteDatabase cuando el contenido cambie, y de alguna manera puede transmitir estas notificaciones a todos los Loader existentes en su aplicación. Escribí una publicación de blog bastante extensa sobre cómo implementar Loader s que podría ser útil si desea asumir este desafío. O...

  2. Use la biblioteca LoaderEx Mark Murphy y solo realice modificaciones en la base de datos utilizando las operaciones AsyncTask proporciona su biblioteca. Tenga en cuenta que la razón por la cual sus tareas actualizan el Loader es porque llaman a onContentChanged en el Loader inmediatamente después de que se realiza la inserción / actualización / eliminación, indicando efectivamente al Loader que el contenido ha cambiado y que debe actualizar sus datos.

  3. Simplemente use un ContentProvider con un CursorLoader y puede usar el ContentResolver#notifyChange() para notificar al CursorLoader que se ha producido un cambio de contenido.

Estoy tratando de encontrar una solución mejor, e informaré en el futuro si alguna vez encuentro / implemento una, pero por ahora tendrán que hacerlo.