首页 > 解决方案 > 改造和房间模型互操作性

问题描述

我正在尝试开发一个通过改造使用 REST API 并将接收到的结果缓存在 Room DB 中的 Android 应用程序。我计划实现此行为的方式是让 Room 创建的本地数据库通过我的存储库充当我的数据的 SSoT(单一事实来源)。

当我尝试为单个UserEntity(我的模型之一)实现 Room 配置和行为时,出现了我的问题。此数据库实体包含与改造用户模型完全相同的原子信息(id、用户名、电子邮件、描述),并且不包含服务器响应或照片 URL 字段。现在,当我有两个模型并且需要在存储库中创建一个方法来返回 LiveData 实例时,我不确定如何在不手动转换它们的情况下适应这两种类型(因为一旦我从改造请求并更新采用 UserEntity 参数的 Room DB,但另一次我可能只是从缓存中获取用户数据)。

我想知道是否有任何方法可以简单地为RetrofitRoom操作提供一个模型,或者我是否需要手动将我的 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. . .
}

先感谢您!

标签: androidmvvmmodelretrofit2android-room

解决方案


我们使用@Entity 元数据在我们使用房间创建的数据库中拥有一个映射 SQLite 表。但是,它是一个数据/POJO 类,可以在使用 Gson 将 JSON 解析为 POJO 时使用。

然后可以将相同的 POJO 类插入到数据库表中。


推荐阅读