Convierta ForeignCollection en ArrayList-ORMLite, Gson y Android
foreign-collection (3)
¿Es este un buen plan o debería escribir dos formas completamente separadas de extraer la URL de imagen de los datos, NO convertir el objeto de ForeignCollection a ArrayList?
Deberia de funcionar. No veo una manera fácil de hacerlo de lo contrario.
Algunos puntos:
- ¿Hay alguna manera de marcar
ForeignCollection
como transitorio por lo que se ignora cuando se transfiere a través de JSON? Luego puede usar el mismo objeto deUser
para JSON y ORMLite. - Algún tipo de método de
hydrate()
sería bueno para convertir demedia
->mediaCollection
y viceversa. - Si necesita cargar imágenes transferidas a JSON en la colección foránea, debe usar el
Dao.getEmptyForeignCollect(...)
. Una vez que tenga la colección, puede agregar imágenes y se agregarán a las tablas.
Si es un buen plan, ¿cómo convierto un ForeignCollection a un ArrayList?
Esto es más fácil. A ForeignCollection
es una Collection
. Puedes hacer un:
media = new ArrayList<Image>(mediaCollection);
Por lo tanto, su método User.getMedia()
debería comprobar null
y, en caso afirmativo, mediaCollection
desde el campo mediaCollection
.
Me disculpo si no soy muy claro con mi explicación, pero agregaré y editaré esta pregunta para mayor claridad si así lo solicita.
Estoy desarrollando una aplicación de Android que recibe datos a través de una API externa y almacena datos localmente usando ORMLite. Antes de almacenar datos localmente y usar ORMLite, tuve modelos que recuperaban JSON del servidor y lo analizaban a través de:
Gson gson = new Gson();
String result = ApiClient.httpPost("/user_route");
User user = gson.fromJson(result, User.class);
La clase de Usuario fue definida
public class User {
int id;
String name;
ArrayList<Image> media;
}
Y la clase de imagen:
public class Image {
int id;
int creator_id;
String url;
}
Esta es una representación simplificada de los modelos y métodos, pero creo que he conservado toda la información relevante. BTW, media
es un objeto JSON que contiene las Images
.
Ahora estoy tratando de almacenar también los datos localmente. Para tener la relación entre Usuarios e Imágenes usando ORMLite, parece que tienes que emplear la clase ForeignCollection y la anotación @ForeignCollectionField. No creo que Gson pueda analizar directamente el Json para el campo de media
en la clase User como un objeto ForeignCollection, así que pensé que necesitaba crear dos campos mediaCollection
y media
.
Con ORMLite, la clase User ahora se ve así:
@DatabaseTable(tableName = "Users")
public class User {
@DatabaseField(generatedId = true)
int id;
@DatabaseField
String name;
@ForeignCollectionField
ForeignCollection<Image> mediaCollection;
ArrayList<Image> media;
}
La clase de imagen con ORMLite se ve así:
@DatabaseTable(tableName = "Images")
public class Image {
@DatabaseField(generatedId = true)
int id;
@DatabaseField(foreign=true, foreignAutoCreate=true, foreignAutoRefresh=true)
private User user;
@DatabaseField
int creator_id;
@DatabaseField
String url;
}
Cómo funciona el flujo de la aplicación es lo primero que hago en la base de datos local para un usuario. Realizo un poco de lógica que luego determina si necesito presionar el servidor para ''actualizar'' o ''actualizar'' los datos del usuario.
Si los datos vienen localmente o desde el servidor remoto, necesito mostrar la Image
en la misma vista. Tal como está ahora, la URL de la Image
se almacena en diferentes tipos de objetos dependiendo de si los datos son locales o remotos. Lo que me gustaría hacer es si la Image
se almacena en un objeto ForeginCollection
, convertir ese objeto en una ArrayList
y luego proceder con el resto de mi código que extrae la URL de la Image
y la muestra.
Supongo que hay dos preguntas.
¿Es este un buen plan o debería escribir dos formas completamente separadas de extraer la URL de
Image
de los datos, NO convertir el objeto deForeignCollection
aArrayList
?Si es un buen plan, ¿cómo convierto un
ForeginCollection
a unArrayList
?
No puede crear una ColecciónExterna además de almacenar primero los objetos en la base de datos, luego tener ormlite recuperarlos en ForeignCollection. Puede usar una Colección en lugar de una ColecciónExtranjera, pero funciona de la misma manera. Lo que hago es lo siguiente: tengo dos colecciones en la clase para padres. Una es una ArrayList en la que se deserializa json o xml. Cuando el objeto principal se almacena, el dao almacena los objetos en el Arraylist en la base de datos, en la tabla que está vinculada a la otra Colección, ForeignCollection. Cuando se recupera el objeto primario, contiene automáticamente los objetos en ForeignCollection. No es perfecto, pero funciona.
Solo para convertir de @ForeignCollectionField
a ArrayList<Object>
puedes hacer eso:
ArrayList<Object> taskFieldsList = new ArrayList<Object>(your collection);
Espero que sea de ayuda.