Convertir ForeignCollection en ArrayList – ORMLite, Gson y Android
Me disculpo si no estoy muy claro con mi explicación, pero voy a añadir y editar esta pregunta para mayor claridad si se solicita.
Estoy desarrollando una aplicación para Android que recibe datos a través de una API externa y almacena datos localmente utilizando ORMLite. Antes de almacenar datos localmente y usar ORMLite, tenía modelos que recuperaban JSON del servidor y lo analizaban a través de:
- Objeto de almacenamiento Robospice que extiende ArrayList en la base de datos a través de Ormlite
- Usando limit () y offset () en QueryBuilder (ANDROID, ORMLITE)
- ¿OrmLite debería suceder las operaciones de db en el hilo principal?
- El bloqueo de la aplicación con "android.app.Application no se puede convertir en"
- Excepción al intentar crearOrUpdate un objeto utilizando OrmLite
Gson gson = new Gson(); String result = ApiClient.httpPost("/user_route"); User user = gson.fromJson(result, User.class);
La clase User se definió
public class User { int id; String name; ArrayList<Image> media; }
Y la clase Image:
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 guardado toda la información pertinente. BTW, media
es un objeto JSON que contiene las Images
.
Ahora estoy tratando de almacenar los datos localmente. Para tener la relación entre Usuarios e Imágenes usando ORMLite parece que tiene que emplear la clase ForeignCollection y la anotación @ForeignCollectionField. No creo que Gson pueda analizar directamente el Json para el campo media
en la clase User como un objeto ForeignCollection, así que pensé que necesitaba crear dos campos mediaCollection
y media
.
Utilizando 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 Image con ORMLite tiene este aspecto:
@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 en primer lugar me golpeó la base de datos local para un usuario. Realizo alguna lógica que luego determina si necesito realmente golpear el servidor para 'actualizar' o 'actualizar' los datos de usuario.
Si los datos vienen localmente o desde el servidor remoto, necesito mostrar la Image
en la misma vista. En este momento, 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 un ArrayList
y luego proceder con el resto de mi código que extrae la URL de la Image
y lo muestra.
Supongo que hay dos preguntas.
-
¿Es este un buen plan o debería escribir dos formas completamente separadas de extraer la URL de la
Image
de los datos, NO convertir el objeto deForeignCollection
aArrayList
? -
Si es un buen plan, ¿cómo puedo convertir una
ForeginCollection
a unaArrayList
?
- ¿Cómo puedo saber si mi aplicación se ejecuta con Robolectric?
- ¿Cómo conectarse a SQLite DB con contraseña con OrmLite?
- La aplicación en la liberación se bloquea, mientras que en depuración no
- ORMLite y agregar una entidad persistente existente a una colección de campo externa
- Los ejemplos de ORMLite para Android no compilarán
- Cómo utilizar Ormlite con LoaderManager
- ORMLite muchas a muchas relaciones Android
- Cómo eliminar un registro de ORMLITE?
¿Es este un buen plan o debería escribir dos formas completamente separadas de extraer la URL de la imagen de los datos, NO convertir el objeto de ForeignCollection a ArrayList?
Deberia de funcionar. No veo una manera fácil de hacerlo de otra manera.
Algunos puntos:
- ¿Hay alguna manera de marcar la
ForeignCollection
como transitorio por lo que se ignora cuando se transfiere a través de JSON? A continuación, puede utilizar el mismo objeto deUser
para JSON y ORMLite. - Algún tipo de método
hydrate()
sería bueno para convertir demedia
->mediaCollection
y viceversa. - Si necesita cargar imágenes transferidas JSON en la colección extranjera, debe utilizar el
Dao.getEmptyForeignCollect(...)
. Una vez que tengas la colección, puedes añadir imágenes a ella y se añadirán a las tablas.
Si es un buen plan, ¿cómo puedo convertir una ForeignCollection a una ArrayList?
Esto es más fácil. Una ForeignCollection
es una Collection
. Sólo puede hacer una:
media = new ArrayList<Image>(mediaCollection);
Por lo tanto, su método User.getMedia()
debería comprobar si hay null
y, si es así, convertirlo desde el campo mediaCollection
.
Sólo para convertir de @ForeignCollectionField
a ArrayList<Object>
puede hacer eso:
ArrayList<Object> taskFieldsList = new ArrayList<Object>(your collection);
Espero que te ayude
No puede crear una ForeignCollection aparte de primero almacenar los objetos en la base de datos, y luego ormlite recuperarlos en la ForeignCollection. Puede utilizar una colección en lugar de una colección extranjera, pero funciona de la misma manera. Lo que hago es lo siguiente: Tengo dos colecciones en la clase padre. Uno es un ArrayList que el json o xml es deserializado en. Cuando el objeto primario 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, a ForeignCollection. Cuando se recupera el objeto primario, contiene automáticamente los objetos en ForeignCollection. No es perfecto, pero funciona.
- ¿Por qué la densidad de Nexus 6 es de 560 ppp?
- ¿Cómo puedo eliminar completamente un hilo de Android?