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

wul*_*ong 29 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);
Run Code Online (Sandbox Code Playgroud)

User类已定义

public class User {
  int id;
  String name;
  ArrayList<Image> media;
}
Run Code Online (Sandbox Code Playgroud)

而Image类:

public class Image {
  int id;
  int creator_id;
  String url;
}
Run Code Online (Sandbox Code Playgroud)

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

现在我还试图在本地存储数据.为了使用ORMLite在Users和Images之间建立关系,你似乎必须使用ForeignCollection类和@ForeignCollectionField注释.我不相信Gson可以直接media将User类中的字段作为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;
}
Run Code Online (Sandbox Code Playgroud)

带有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;

}
Run Code Online (Sandbox Code Playgroud)

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

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

我想有两个问题.

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

  2. 如果这一个好计划,我该如何转换ForeginCollectionArrayList

Gra*_*ray 21

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

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

一些要点:

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

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

这更容易.A ForeignCollection是一个Collection.你可以做一个:

media = new ArrayList<Image>(mediaCollection);
Run Code Online (Sandbox Code Playgroud)

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