Android – Uso de DAO de ORMLite como ContentProvider

He visto el patrón C en la presentación de Google IO y estoy muy ansioso de implementar este patrón. Sin embargo, realmente me gusta la biblioteca ORMLite y me gustaría usar esta biblioteca en mi aplicación también.

Cuando digo Google IO presentación me refiero a esta: https://www.youtube.com/watch?v=xHXn3Kg2IQE por Virgil Dobjanschi.

Ahora he estado buscando mucho para una implementación que me muestra cómo usar ORMLite en conjunto con Contentproviders.

Ahora mi problema aquí es que el DAO de ORMLite está en conflicto con Contentprovider. Ellos esencialmente hacen lo mismo y son un dolor para integrarse el uno en el otro. ( Usando Ormlite en conjunción con el proveedor de contenido de Android, otros están discutiendo esto y están de acuerdo con esta afirmación).

Algunas bibliotecas han implementado ORMLite en el patrón API de contentprovider, un ejemplo es: https://github.com/blandware/android-atleap

Sin embargo, bajo el agua todavía revertir el modelo a ContentValues ​​(tipos simples).

Android – Uso de Dao Pattern con contentProvider Esta pregunta es similair a mi situación, pero hace 3 años y estoy sugiriendo una solución alternativa a continuación.

@ Jcwenger respuesta es muy útil, pero me preguntaba si algo ha cambiado en los últimos 3 años. Estoy enfrentando el mismo problema y tal vez ahora desde que ORMLite ha madurado, es más gratificante usar ORMLite?

Mi colega a mi lado realmente, realmente quiere usar ORMLite ya que él no quiere tener que escribir ningún mapa de sí mismo. Sé de la existencia de los proyectos atleap y Android-OrmLiteContentProvider. Estos sólo proporcionan un cursor a la actividad y mi colega quiere tener listas de modelos o un solo modelo. ¿Puede lograrse esto?

Mi colega sugiere escribir mi propia implementación del Cursor, SyncAdapter? Y Contentprovider (tiene que ser hecho independientemente) para trabajar con modelos. Sin embargo, ¿se puede lograr la misma funcionalidad con listas, etc? Pasando eventos a la actividad a contentobservers etc?

¿Es esto viable?

Editar Es muy probable que utilicemos privadamente los contentproviders. No necesitamos exponer estos proveedores de contenido. Sin embargo, las ventajas que ofrecen contentproviders son grandes. ¿De qué otra manera podría notificar a mi GUI para actualizar cuando los datos han cambiado?

También tengo que mostrar datos de varias tablas (uniones y otros datos, no contenidos en la misma tabla) en una actividad y descargar imágenes, etc.

Así que ya que no pude encontrar una respuesta adecuada, así es como lo resolví después de un tiempo de intentarlo:

public class CardProvider extends ContentProvider { private InternalDatabase dbhelper; private RuntimeExceptionDao<Card, UUID> cardDao; /** * Content authority for this provider. */ private static final String AUTHORITY = CardUris.CONTENT_AUTHORITY; // The constants below represent individual URI routes, as IDs. Every URI pattern recognized by // this ContentProvider is defined using sUriMatcher.addURI(), and associated with one of these // IDs. // // When a incoming URI is run through sUriMatcher, it will be tested against the defined // URI patterns, and the corresponding route ID will be returned. /** * URI ID for route: /cards */ public static final int ROUTE_CARDS = 1; /** * URI ID for route: /cards/{ID} */ public static final int ROUTE_CARDS_ID = 2; /** * UriMatcher, used to decode incoming URIs. */ private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sUriMatcher.addURI(AUTHORITY, "cards", ROUTE_CARDS); sUriMatcher.addURI(AUTHORITY, "cards/*", ROUTE_CARDS_ID); } @Override public int delete(Uri arg0, String arg1, String[] arg2) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri uri) { final int match = sUriMatcher.match(uri); switch (match) { case ROUTE_CARDS: return CardUris.CONTENT_CARDS; case ROUTE_CARDS_ID: return CardUris.CONTENT_ITEM_CARD; default: throw new UnsupportedOperationException("Unknown uri: " + uri); } } @Override public Uri insert(Uri arg0, ContentValues arg1) { // TODO Auto-generated method stub return null; } @Override public boolean onCreate() { dbhelper = OpenHelperManager.getHelper(getContext(), InternalDatabase.class); cardDao = dbhelper.getRuntimeExceptionDao(Card.class); return true; } @Override public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3, String arg4) { int uriMatch = sUriMatcher.match(uri); switch (uriMatch) { case ROUTE_CARDS_ID: /*String id = uri.getLastPathSegment(); Card card = null; try { card = cardDao.queryBuilder().where().eq(Entry.ID_FIELD_NAME, id).queryForFirst(); } catch (SQLException e) { e.printStackTrace(); }*/ //return null; case ROUTE_CARDS: // Return all known entries. // Note: Notification URI must be manually set here for loaders to correctly // register ContentObservers. // build your query QueryBuilder<Card, UUID> qb = cardDao.queryBuilder(); // when you are done, prepare your query and build an iterator CloseableIterator<Card> iterator = null; Cursor cursor = null; try { //qb.query(); iterator = cardDao.iterator(qb.where().eq("relevant", 1).and().eq("removed", false).prepare()); // get the raw results which can be cast under Android AndroidDatabaseResults results = (AndroidDatabaseResults)iterator.getRawResults(); cursor = results.getRawCursor(); } catch (SQLException e) { e.printStackTrace(); } finally { //iterator.closeQuietly(); } cursor.setNotificationUri(this.getContext().getContentResolver(), uri); return cursor; default: throw new UnsupportedOperationException("Unknown uri: " + uri); } } @Override public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { // TODO Auto-generated method stub return 0; } } 

Probablemente podría dar propósito a los métodos de inserción, actualización y eliminación, pero el dao hace esto también y es lo que estoy usando.

  • Proguard con OrmLite en Android
  • ORMLite para Android no autorefresh objeto extranjero utilizando foreignAutoRefresh
  • ¿Cómo puedo anotar correctamente las clases de herencia usando ORMLite?
  • ORMLITE ORDER_BY con varias columnas
  • Crear varias tablas para una clase en ORMLite
  • Valor predeterminado para int en OrmLite Android
  • Ormlite, listViews y adaptadores?
  • Condición de consulta múltiple en Android usando ORMLITE
  • Cómo generar una consulta con la selección por valor del campo del objeto extraño
  • ORMLite en Android no llamando a Creación
  • Android - ORMlite vs ActiveAndroid diferencias?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.