java - simple - ormlite c#
Guardando colecciones de niƱos con OrmLite en Android con objetos creados a partir de Jackson (1)
Es posible que desee intentar usar una colección ForeignCollection en lugar de una colección en su clase principal.
De la documentación de ORMLite:
"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á impaciente, y las llamadas a DAO también afectarán a la tabla [secundaria] para ambas colecciones ansiosas 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 agregar / quitar se reenvía a la base de datos. ( http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/ForeignCollection.html#add(T) )
Sin embargo, nunca he trabajado con esto, así que espero que la documentación sea correcta y que esto te ayude a resolver tu problema. :-)
Tengo un servicio REST al que estoy llamando desde mi aplicación, que ingresa un objeto JSON como un byte[]
que luego se convierte en una buena colección de objetos anidados, todo ese bit funciona bien. Lo que luego quiero hacer es persistir estos objetos en el almacenamiento de SQLite utilizando OrmLite, y ahí es donde las cosas comienzan a descomponerse, porque, según tengo entendido, OrmLite no persiste automáticamente los objetos anidados.
Para simplificar, eliminemos mi funcionalidad real y dejemos que mis objetos se modelen de la siguiente manera:
@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 principal en la base de datos con mi correspondiente objeto parentDao
, los elementos parentDao
no se conservan junto con el elemento principal.
Esta es una pregunta común y se ha planteado antes, definitivamente hay otras preguntas sobre SO que son muy similares a esta, especialmente Salvando objetos extraños anidados con ORMLite en Android en respuesta a lo que Gray sugiere crear el objeto secundario antes que el padre que funcionaría bien para crear mis POJOs manualmente.
Sin embargo, todavía no he visto una respuesta que tenga en cuenta 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 (lo 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 esté perdiendo algo, ¿es más fácil de lo que parece?) Esa no parece ser una solución particularmente atractiva en este caso particular.
Igualmente, hay otras soluciones que implican agregar más anotaciones a la clave externa que parecen ser adecuadas para trabajar con objetos secundarios individuales, pero esas anotaciones no están disponibles cuando se trabaja con @ForeignCollectionField
sy sus correspondientes Collection
.