29

如果我对我的解释不是很清楚,我深表歉意,但如果需要,我会添加并编辑这个问题以便清楚起见。

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

和图像类:

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

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

现在我也在尝试将数据存储在本地。为了使用 ORMLite 在用户和图像之间建立关系,您似乎必须使用 ForeignCollection 类和 @ForeignCollectionField 注释。我不相信 Gson 可以直接media将 User 类中的字段的 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 的 URL 存储在不同类型的对象中。我想做的是,如果Image存储在一个ForeginCollection对象中,将该对象转换为一个ArrayList,然后继续执行我的其余代码,提取ImageURL 并显示它。

我想有两个问题。

  1. 这是一个好的计划还是我应该编写两种完全不同的方法来Image从数据中提取 URL,而不是将对象从 转换ForeignCollectionArrayList

  2. 如果这一个好计划,我如何将 a 转换为ForeginCollectiona ArrayList

4

3 回答 3

21

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

它应该工作。我没有看到一个简单的方法来做到这一点。

几点:

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

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

这更容易。AForeignCollection是一个Collection。你可以做一个:

media = new ArrayList<Image>(mediaCollection);

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

于 2012-10-03T14:07:52.947 回答
2

只是为了转换@ForeignCollectionFieldArrayList<Object> 你可以这样做:

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

希望对你有帮助。

于 2015-03-11T13:56:07.890 回答
0

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

于 2012-10-02T23:59:50.910 回答