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é

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

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:

  1. 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 los Loader existentes en su aplicación. Escribí una extensa publicación en el blog sobre cómo implementar Loader s que podría resultar útil si deseas enfrentarte a este desafío. O…

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

  3. Sólo utilice un ContentProvider con un CursorLoader y puede utilizar el ContentResolver#notifyChange() para notificar al CursorLoader 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); 
  • Bases de datos de sincronización Mysql SQLite
  • ¿El cursor SQLite de Android carga todos los registros en la memoria a la vez?
  • AUTOINCREMENT sólo está permitido en un INTEGER PRIMARY KEY - android
  • Un simple ejemplo androide de Córdova incluyendo Sqlite leer / escribir y buscar
  • ¿Cómo carga todos los campos de una base de datos y ordeno el resultado después de una fila con GreenDao?
  • Android ExpandableListActivity y SimpleCursorTreeAdapter?
  • La aplicación se bloquea al iniciar Debido a java.lang.IllegalArgumentException: la columna '_id' no existe
  • Razones para utilizar la base de datos SQLite legible
  • Cómo implementar Exportar sqlite Para sobresalir / archivo csv en android?
  • Cómo abrir / cerrar SQLite db en Android correctamente
  • Estrategia de clave principal de Android (aplicación distribuida)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.