【发布时间】:2021-01-03 06:35:19
【问题描述】:
我正在尝试开发一个通过 Retrofit 使用 REST API 并将接收到的结果缓存在 Room DB 中的 Android 应用程序。我计划实现此行为的方式是让 Room 创建的本地数据库充当我的 SSoT(单一事实来源),通过我的存储库存储我的数据。
当我尝试为单个 UserEntity(我的模型之一)实现 Room 配置和行为时,出现了我的问题。此数据库实体包含与 Retrofit User 模型完全相同的原子信息(id、用户名、电子邮件、描述),并且不包含服务器响应或照片 URL 字段。现在,当我有两个模型并且需要在存储库中创建一个方法来返回 LiveData 实例时,我不确定如何在不手动转换它们的情况下适应这两种类型(因为一旦我从改造请求并更新采用 UserEntity 参数的 Room DB,但有一次我可能只是从缓存中获取用户数据。
我想知道是否有任何方法可以让一个模型同时用于 Retrofit 和 Room 操作,或者我是否需要将我的 Retrofit 服务器响应模型转换为我的 Room手动数据库实体。模型中是否不可能同时具有 @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. . .
}
提前谢谢你!
【问题讨论】:
标签: android mvvm model retrofit2 android-room