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:

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.

  1. ¿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 de ForeignCollection a ArrayList ?

  2. Si es un buen plan, ¿cómo puedo convertir una ForeginCollection a una ArrayList ?

¿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 de User para JSON y ORMLite.
  • Algún tipo de método hydrate() sería bueno para convertir de media -> 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.

  • Crash ORMLite en Android con proguard
  • Consulta compleja con SQL COUNT y SUM
  • Cuando agrego un nuevo campo consigo un puntero nulo
  • Orm Lite - No se pudo encontrar el constructor público que tiene un solo argumento (Context) para la clase helper
  • Ayudante de base de datos Ormlite - onCreate () no llamado
  • Borrar datos antiguos de caché con robospice ormlite
  • Cómo generar una consulta con la selección por valor del campo del objeto extraño
  • Crear varias tablas para una clase en ORMLite
  • Ver SQL generado por ORMLite en Android
  • Ormlite SQLiteCursor: cierre el cursor en null dos veces o más
  • Android, Ormlite, ubicación de DB
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.