android - 改造和房间模型互操作性
问题描述
我正在尝试开发一个通过改造使用 REST API 并将接收到的结果缓存在 Room DB 中的 Android 应用程序。我计划实现此行为的方式是让 Room 创建的本地数据库通过我的存储库充当我的数据的 SSoT(单一事实来源)。
当我尝试为单个UserEntity(我的模型之一)实现 Room 配置和行为时,出现了我的问题。此数据库实体包含与改造用户模型完全相同的原子信息(id、用户名、电子邮件、描述),并且不包含服务器响应或照片 URL 字段。现在,当我有两个模型并且需要在存储库中创建一个方法来返回 LiveData 实例时,我不确定如何在不手动转换它们的情况下适应这两种类型(因为一旦我从改造请求并更新采用 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. . .
}
先感谢您!
解决方案
我们使用@Entity 元数据在我们使用房间创建的数据库中拥有一个映射 SQLite 表。但是,它是一个数据/POJO 类,可以在使用 Gson 将 JSON 解析为 POJO 时使用。
然后可以将相同的 POJO 类插入到数据库表中。
推荐阅读
- c# - 对用户进行身份验证并从事件中返回数据
- asp.net-core - 什么可能导致关联 cookie 无法在特定设备上返回
- yii2 - 如何调试 Yii2 迁移?
- listview - Xamarin 表单列表视图 - 数据模板到列
- java - ThreadMXBean.getThreadAllocatedBytes(long id)中包含哪些JVM运行时数据区
- java - 无法使用 Java 读取包含阿拉伯语内容的 Excel 文件
- javascript - 如何在 Jquery 中多次调用一个函数来添加一个事件监听器而不只是监听最后一个?
- sql - 设置声明的参数值和 CONCAT 列名
- c - 结构指针成员的分段错误(核心转储)
- xpath - Google Sheets IMPORTXML XPath 帮助(了解如何阅读页面源代码)