改造和房间模型互操作性
Retrofit and Room Model Interoperability
我正在尝试开发一个 Android 应用程序,它通过 Retrofit 使用 REST API 并将接收到的结果缓存在 Room DB 中。我计划实现此行为的方式是让 Room 创建的本地数据库通过我的存储库充当我的数据的 SSoT(单一真实来源)。
当我尝试为单个 UserEntity(我的模型之一)实现 Room 配置和行为时,我的问题出现了。此数据库实体包含与 Retrofit User 模型(id、用户名、电子邮件、描述)完全相同的原子信息,并且不包含服务器响应或照片 URL 字段。现在,当我有两个模型并且我需要在存储库中创建一个方法到 return 一个 LiveData 实例时,我不确定如何在不手动转换它们的情况下适应这两种类型(因为一旦我检索到来自 Retrofit 请求的用户模型并更新采用 UserEntity 参数的 Room DB,但另一次我可能只是从缓存中获取用户数据。
我想知道是否有任何方法可以简单地为 Retrofit 和 Room 操作提供一个模型,或者我是否需要转换我的 Retrofit 服务器响应模型手动到我的 Room DB 实体。是否不可能在模型中同时使用 @SerializedName 和 @ColumnInfo 注释(如果其他模型需要,请使用 @Ignore 让 Room 忽略不必要的字段)?或者这只会混淆整个模型并使其无法使用?
进一步深入了解的代码摘录:
UserEntity.java(房间模型)
@Entity(tableName = "users")
public class UserEntity {
@PrimaryKey
@NonNull
private int id; // id is fetched from network response - not autogenerated
@ColumnInfo(name = "username")
private String username;
@ColumnInfo(name = "description")
private String description;
@ColumnInfo(name = "email")
private String email;
public UserEntity(int id, String username, String description, String email) {
this.id = id;
this.username = username;
this.description = description;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
User.java(改造响应)
public class User extends Model implements Parcelable {
@SerializedName("id")
@Expose
@Nullable
private Integer id;
@SerializedName("username")
@Expose
@Nullable
private String username;
@SerializedName("description")
@Expose
@Nullable
private String description;
@SerializedName("email")
@Expose
@Nullable
private String email;
@SerializedName("photo_url")
@Expose
@Nullable
private String photoUrl;
// constructors, getters & setters, & implementations. . .
}
提前致谢!
@我们使用的实体元数据在我们使用房间创建的数据库中有一个映射 SQLite table。但是,它是一个 data/POJO class ,可以在使用 Gson 将 JSON 解析为 POJO 时使用。
然后可以将相同的 POJO class 插入数据库 table。
我正在尝试开发一个 Android 应用程序,它通过 Retrofit 使用 REST API 并将接收到的结果缓存在 Room DB 中。我计划实现此行为的方式是让 Room 创建的本地数据库通过我的存储库充当我的数据的 SSoT(单一真实来源)。
当我尝试为单个 UserEntity(我的模型之一)实现 Room 配置和行为时,我的问题出现了。此数据库实体包含与 Retrofit User 模型(id、用户名、电子邮件、描述)完全相同的原子信息,并且不包含服务器响应或照片 URL 字段。现在,当我有两个模型并且我需要在存储库中创建一个方法到 return 一个 LiveData 实例时,我不确定如何在不手动转换它们的情况下适应这两种类型(因为一旦我检索到来自 Retrofit 请求的用户模型并更新采用 UserEntity 参数的 Room DB,但另一次我可能只是从缓存中获取用户数据。
我想知道是否有任何方法可以简单地为 Retrofit 和 Room 操作提供一个模型,或者我是否需要转换我的 Retrofit 服务器响应模型手动到我的 Room DB 实体。是否不可能在模型中同时使用 @SerializedName 和 @ColumnInfo 注释(如果其他模型需要,请使用 @Ignore 让 Room 忽略不必要的字段)?或者这只会混淆整个模型并使其无法使用?
进一步深入了解的代码摘录:
UserEntity.java(房间模型)
@Entity(tableName = "users")
public class UserEntity {
@PrimaryKey
@NonNull
private int id; // id is fetched from network response - not autogenerated
@ColumnInfo(name = "username")
private String username;
@ColumnInfo(name = "description")
private String description;
@ColumnInfo(name = "email")
private String email;
public UserEntity(int id, String username, String description, String email) {
this.id = id;
this.username = username;
this.description = description;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
User.java(改造响应)
public class User extends Model implements Parcelable {
@SerializedName("id")
@Expose
@Nullable
private Integer id;
@SerializedName("username")
@Expose
@Nullable
private String username;
@SerializedName("description")
@Expose
@Nullable
private String description;
@SerializedName("email")
@Expose
@Nullable
private String email;
@SerializedName("photo_url")
@Expose
@Nullable
private String photoUrl;
// constructors, getters & setters, & implementations. . .
}
提前致谢!
@我们使用的实体元数据在我们使用房间创建的数据库中有一个映射 SQLite table。但是,它是一个 data/POJO class ,可以在使用 Gson 将 JSON 解析为 POJO 时使用。
然后可以将相同的 POJO class 插入数据库 table。