2012-10-02 18 views
27

Disculpa si no soy muy claro con mi explicación, pero añadiré y editaré esta pregunta para mayor claridad si así lo solicita.Convierte ForeignCollection a ArrayList - ORMLite, Gson y Android

Estoy desarrollando una aplicación para Android que recibe datos a través de una API externa y almacena datos localmente usando ORMLite. Antes de almacenar datos localmente y utilizar ORMLite tuve modelos que recuperan JSON desde el servidor y Analizada vía:

Gson gson = new Gson(); 

String result = ApiClient.httpPost("/user_route"); 

User user = gson.fromJson(result, User.class); 

se definió la clase de usuario

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 conservado toda la información relevante. Por cierto, media es un objeto JSON que contiene el Images.

Ahora intento también almacenar 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 media en la clase User como un objeto ForeignCollection, así que pensé que necesitaba crear dos campos mediaCollection y media.

Usando ORMLite la clase de usuario 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 imágenes con ORMLite se parece a esto:

@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 el primer golpeo local base de datos 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 el Image en la misma vista. Tal como está ahora, la URL para el 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 el Image está almacenado en un objeto ForeginCollection, convierta ese objeto en un ArrayList y luego proceda con el resto de mi código que extrae el URL Image y lo muestra.

Supongo que hay dos preguntas.

  1. Es este un buen plan o debo escribir dos maneras completamente separadas de la extracción de la URL Image partir de los datos, NO convertir el objeto ForeignCollection-ArrayList?

  2. Si es un buen plan, ¿Cómo se convierte un ForeginCollection a un ArrayList?

+0

ver la respuesta en otro hilo relacionado: http://stackoverflow.com/a/31598771/3495371 –

Respuesta

20

¿Es este un buen plan o debo escribir dos formas completamente separadas de extraer la URL de imagen de los datos, NO convertir el objeto de ForeignCollection a ArrayList?

Debería funcionar. No veo una manera fácil de hacerlo de lo contrario.

Algunos puntos:

  • ¿Hay alguna manera de marcar el ForeignCollection como transitorio por lo que se ignora cuando se transfiere a través de JSON? Luego puede usar el mismo objeto 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 a JSON en la colección extranjera, debe usar el método 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 se convierte un ForeignCollection a un ArrayList?

Esto es más fácil. A ForeignCollection es un Collection. Usted sólo puede hacer una:

media = new ArrayList<Image>(mediaCollection); 

Así que su método User.getMedia() debe comprobar para null y si es así, convertir de mediaCollection el campo.

+0

¿Puede ampliar la conversión de un 'ForeignCollection' ? Estoy tratando de obtener una matriz usando 'Image [] media = mediaCollection.toArray (new Image [0])' pero esto arroja 'java.lang.IllegalStateException: intento de volver a abrir un objeto ya cerrado: SQLiteDatabase [ ...] 'derivado de' LazyForeignCollection: 232'. –

0

No se puede crear un ForeignCollection aparte de almacenar primero los objetos en la base de datos, entonces tienen ormlite recuperarlos en el 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.

+2

Esto es algo incorrecto. Puede obtener un nuevo 'ForeignCollection' utilizando el método' Dao.getEmptyForeignCollection (...) '. Consulte aquí: http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/Dao.html#getEmptyForeignCollection(java.lang.String%29 – Gray

2

Sólo convertir de @ForeignCollectionField a ArrayList<Object> se puede hacer eso:

ArrayList<Object> taskFieldsList = new ArrayList<Object>(your collection); 

esperanza es que ayude.

Cuestiones relacionadas