android - 如何处理Room中嵌套的1对1对象中的关系数据(将ForeignKey转换为对象)

标签 android android-room android-architecture-components android-jetpack

假设我有一个 OrderUser Entity类似于这样的东西:
User.java :

@Entity
public class User {
    @PrimaryKey    
    public long id;
    @NonNull    
    public String username;
}
Order.java :
@Entity(foreignKeys = @ForeignKey(entity = User.class,
                                  parentColumns = "id",
                                  childColumns = "user_id",
                                  onDelete = ForeignKey.CASCADE,
                                  onUpdate = ForeignKey.CASCADE),
        indices = @Index("user_id"))
public class Order {
    @PrimaryKey
    public long id;
    public String description;

    @ColumnInfo(name = "user_id")
    public long userId;
    @Ignore
    private User user;
}

所以这样,我有一个 OrderUser在其中,在数据库中,我仅将此与用户 ID 的关系保存为 Foreign Key而不是对象本身(它是 @Ignore d),所以一切都很好并且是相关的,并且可以扩展为以几种不同的方式和查询等与其他类型一起使用。

现在,问题是,我如何获得 OrderUser对象自动填充在 Room 里面吗?

如果我使用 @Embedded ,然后 OrderUser将住在同一张 table 上,这不利于类型的关系分离。我可以将它们连同 JOIN 一起退回。但这仍然只适用于具有不同名称的数据类型(也许它们都有一个名为“描述”的列?),此外,插入 OrderUser在里面它不会是简单的 JOIN . @Relation仅适用于一对多,它需要 List ,这不是我的情况。

我想也许是 @TypeConverter将是这里的最佳选择,在 long 之间转换和 User ,但这也很棘手。 @TypeConverter需要引用 DAO所以它可以查询User@TypeConverter是一个静态方法,由 Room 调用,因此传递 DAO除了对每个 User 的额外查询之外,可能会很棘手并导致许多代码异味会触发多个不在同一个 @Transaction 中的搜索.

我是 Room 的新手,但我敢打赌,有一种正确的方法可以解决这个问题,将 Room 与原本打算使用的关系类型一起使用,我只是不知道如何简单而好地完成这项工作,我也找不到它在任何文件中。

最佳答案

Now, the question is, how do I get an Order with the User object automatically populated by Room inside it?



我认为没有一个开箱即用的解决方案。

恕我直言,实体模型(即 Order 将 FK 与 User.id 映射)不应该传播到上层类似于域/表示层,提供 DataMapper 将实体模型转换为上层的域模型(即 User 包含 Order )可能是更好的选择。

关于android - 如何处理Room中嵌套的1对1对象中的关系数据(将ForeignKey转换为对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51958403/

相关文章:

android - 如何在 Android 中解析 URL?

android - 使用 MVVM 时在 View 类中引用存储库类是否正确?

android - 没有发现异常 com.squareup.okhttp.logging.HttpLoggingInterceptor

android - 在我的生物识别加密方法应用程序中从 android 扫描仪获取指纹图像

android - 子类房间实体

java - Room迁移仅在多个表的主键上添加@NonNull注释

android - 如何使用房间数据库作为缓存

android - 具有主视图/详细 View 的导航体系结构组件

android - 将 Map<String, String> 保存到房间数据库的方法

java - 删除 Android 导航和顶部栏,