将ForeignCollection转换为ArrayList – ORMLite,Gson和Android

我很抱歉,如果我没有超清楚我的解释,但我会添加和编辑这个问题,如果要求清晰。

我正在开发一个Android应用程序,通过外部API接收数据,并使用ORMLite在本地存储数据。 在本地存储数据并使用ORMLite之前,我有从服务器中检索JSON的模型,并通过以下方法进行分析:

Gson gson = new Gson(); String result = ApiClient.httpPost("/user_route"); User user = gson.fromJson(result, User.class); 

用户类已定义

 public class User { int id; String name; ArrayList<Image> media; } 

和Image类:

 public class Image { int id; int creator_id; String url; } 

这是模型和方法的简化表示,但是我相信我保留了所有的相关信息。 顺便说一下, media是一个包含Images的JSON对象。

现在我试图在本地存储数据。 为了用户和图像之间的关系使用ORMLite似乎你必须采用ForeignCollection类和@ForeignCollectionField注解。 我不相信Gson可以直接将User类中的media字段的Jsonparsing为ForeignCollection对象,所以我认为我需要创build两个字段mediaCollectionmedia

用户类使用ORMLite现在看起来像这样:

 @DatabaseTable(tableName = "Users") public class User { @DatabaseField(generatedId = true) int id; @DatabaseField String name; @ForeignCollectionField ForeignCollection<Image> mediaCollection; ArrayList<Image> media; } 

带有ORMLite的Image类看起来像这样:

 @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; } 

应用程序的stream程是如何工作的,首先我打到用户的本地数据库。 我执行一些逻辑,然后确定是否需要实际点击服务器来“更新”或“刷新”用户数据。

无论数据来自本地还是来自远程服务器,我都需要在相同的视图中显示Image 。 就目前而言,根据数据是本地还是远程, Image的URL存储在不同types的对象中。 我想要做的是,如果Image存储在ForeginCollection对象中,将该对象转换为一个ArrayList ,然后继续我的代码提取Image URL,并显示它的其余部分。

我想有两个问题。

  1. 这是一个好的计划,还是应该写两个完全独立的方式从数据中提取Image URL,而不是将对象从ForeignCollection转换为ArrayList

  2. 如果这一个很好的计划,我如何将一个ForeginCollection转换成一个ArrayList

Solutions Collecting From Web of "将ForeignCollection转换为ArrayList – ORMLite,Gson和Android"

这是一个好的计划,还是应该写两个完全独立的方式从数据中提取图像URL,而不是将对象从ForeignCollection转换为ArrayList?

它应该工作。 否则,我看不到一个简单的方法。

一些观点:

  • 有没有办法将ForeignCollection标记为瞬态,以便在通过JSON传输时被忽略? 然后,您可以为JSON和ORMLite使用相同的User对象。
  • 某种hydrate()方法会很好,所以它会从media – > mediaCollection转换,反之亦然。
  • 如果您需要将JSON传输的图像加载到外部集合中,则应使用Dao.getEmptyForeignCollect(...)方法。 一旦你有收集,你可以添加图像,他们将被添加到表。

如果这是一个很好的计划,我如何将一个ForeignCollection转换为一个ArrayList?

这很容易。 ForeignCollection是一个Collection 。 你可以做一个:

 media = new ArrayList<Image>(mediaCollection); 

所以你的User.getMedia()方法应该检查null ,如果是的话,从mediaCollection字段转换。

只需要从@ForeignCollectionField转换为ArrayList<Object>你可以这样做:

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

希望这对你有所帮助。

除了首先将对象存储在数据库中之外,您不能创buildForeignCollection,然后让ormlite在ForeignCollection中检索它们。 您可以使用集合而不是ForeignCollection,但它的工作方式相同。 我做的是以下几点:我在父类中有两个集合。 一个是json或xml被反序列化的ArrayList。 当父对象被存储时,dao将Arraylist中的对象存储到与其他Collection(ForeignCollection)链接的表中的数据库中。 当获取父对象时,它将自动包含在ForeignCollection中的对象。 这不是完美的,但它的工作原理。