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

时间:2012-10-02 22:15:33

标签: android arraylist gson ormlite foreign-collection

如果我对我的解释不是很清楚,我会道歉但是如果要求,我会添加并编辑这个问题。

我正在开发一个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;
}

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

现在我正在尝试在本地存储数据。为了使用ORMLite在Users和Images之间建立关系,你似乎必须使用ForeignCollection类和@ForeignCollectionField注释。我不相信Gson可以直接将User类中的media字段的Json解析为ForeignCollection对象,所以我认为我需要创建两个字段mediaCollectionmedia

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

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

}

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

无论数据来自本地还是来自远程服务器,我都需要在同一视图中显示Image。现在,Image的URL存储在不同类型的对象中,具体取决于数据是本地数据还是远程数据。我想要做的是,如果Image存储在ForeginCollection对象中,将该对象转换为ArrayList,然后继续我的其余代码,提取{{1} URL并显示它。

我想有两个问题。

  1. 这是一个好计划,还是应该用两种完全独立的方式从数据中提取Image网址,而不是将对象从Image转换为ForeignCollection?< / p>

  2. 如果一个好的计划,如何将ArrayList转换为ForeginCollection

3 个答案:

答案 0 :(得分:21)

  

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

它应该工作。我没有看到一种简单的方法。

有些观点:

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

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

这更容易。 ForeignCollectionCollection。你可以做一个:

media = new ArrayList<Image>(mediaCollection);

因此,您的User.getMedia()方法应该检查null,如果是,请从mediaCollection字段进行转换。

答案 1 :(得分:2)

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

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

希望它能为您提供帮助。

答案 2 :(得分:0)

除了首先在数据库中存储对象,然后让ormlite在ForeignCollection中检索它们之外,您不能创建ForeignCollection。您可以使用Collection而不是ForeignCollection,但它的工作方式相同。我所做的是以下内容:我在父类中有两个集合。一个是将json或xml反序列化的ArrayList。当父对象被存储时,dao将Arraylist中的对象存储到数据库中,链接到另一个Collection的表是ForeignCollection。检索父对象时,它会自动包含ForeignCollection中的对象。它并不完美,但它确实有效。