Guardando colecciones de niños con OrmLite en Android con objetos creados de Jackson
Tengo un servicio REST al que estoy llamando desde mi aplicación, que tira de un objeto JSON como un byte[]
que luego se convierte en una bonita colección anidada de objetos – todo eso funciona bien. Lo que entonces quiero hacer es persistir estos objetos en el almacenamiento de SQLite usando OrmLite, y ahí es donde las cosas empiezan a descomponerse, porque como yo entiendo, OrmLite no persiste automáticamente los objetos anidados.
Para simplificar, vamos a despojar mi funcionalidad real y dejar que mis objetos sean modelados simplemente como sigue:
- ¿Cómo puedo restablecer un número de secuencia autoincrement en sqlite
- ¿Cómo ORMlite gestiona la herencia entre clases Java?
- ¿Cómo eliminar una base de datos ORMLite?
- Problemas al guardar la colección mediante ORMLite en Android
- ¿Cómo seleccionar valores distintos de ORMlite?
@DatabaseTable(tableName = "parents") public class Parent { @DatabaseField(id=true) private String name; @ForeignCollectionField // have to use Collection here because needs to be compatible with Jackson private Collection<Child> children; /* Getters and setters go here */ } @DatabaseTable(tableName = "children") public class Child { @DatabaseField(id=true) private String name; @DatabaseField(foreign=true) private Parent parent; /* Getters and setters go here */ }
Lo que sucede es que al agregar la creación de un nuevo objeto Parent
en la base de datos con mi objeto parentDao
correspondiente, los niños no se persistirán junto con el padre.
Esta es una pregunta común y se ha planteado antes, sin duda hay otras preguntas sobre SO que son muy similares a este, sobre todo " Guardar objetos anidados nicho con ORMLite en Android " en respuesta a lo que Gray sugiere la creación del objeto hijo antes de la Padre que trabajaría muy bien para crear mis POJOs manualmente.
Sin embargo, todavía no he visto una respuesta que los factores en los casos en que los objetos están siendo generados por otra biblioteca (en este caso Jackson). Sin profundizar en las entrañas de deserialización de Jackson (que elimina todo el beneficio de su simplicidad) e intentar que Jackson cree los objetos secundarios y luego los agregue a los padres (a menos que me falte algo y esto es más fácil de lo que parece). Que no parece ser una solución particularmente atractiva en este caso particular.
Igualmente, existen otras soluciones que implican añadir anotaciones adicionales a la clave externa que parecen ser adecuadas para trabajar con objetos de un solo hijo, pero esas anotaciones no están disponibles cuando se trabaja con @ForeignCollectionField
y sus Collection
correspondientes.
- Cómo generar una consulta con la selección por valor del campo del objeto extraño
- ORMLite Seleccionar campos distintos
- Android OrmLite base de datos pre-poblar
- Uso de Ormlite en combinación con el proveedor de contenido de Android
- CursorWindowAllocationException en el método ORMLite estándar
- Listar todas las tablas de ormlite db android
- ORMLite insertar o reemplazar
- Ormlite configuración sin utilizar las actividades de base
Es posible que desee probar usar una ForeignCollection en lugar de una colección en su clase padre.
De la ORMLite-Documentación:
"Las colecciones extranjeras admiten los métodos add () y remove (), en cuyo caso los objetos se agregarán o eliminarán de la lista interna si la colección está ansiosa, y las llamadas DAO se harán para afectar también a la tabla [child] Para las colecciones ávidas y perezosas. "
( http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Foreign-Collection )
En la documentación de la clase en sí también indica que el add / remove se reenvía a la base de datos. ( http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/ForeignCollection.html#add(T) )
Nunca he trabajado con esto, así que sólo espero que la documentación sea correcta y esto le ayuda a resolver su problema. Todos los derechos reservados
- ¿Cómo puedo establecer el estilo de un textView programatically?
- ¿Cómo obtener estadísticas de uso de la CPU en Android?