Android Room - 带有附加字段的多对多关系

Posted

技术标签:

【中文标题】Android Room - 带有附加字段的多对多关系【英文标题】:Android Room - Many to Many Relation with additional field 【发布时间】:2021-07-13 05:55:09 【问题描述】:

我在 Room 数据库上设置了多对多关系,如下图所示:

我想在“CrossRef”表中添加额外的字段。我的问题是如何让 DateWithSteaks 从“CrossRef”表中获取这个“isCompleted”变量?

@Entity
public class Steak

    @PrimaryKey(autoGenerate = true)
    public int id;

    public String title;



@Entity
public class Date 
    @PrimaryKey
    public long date;

    public Date() 
        date = new LocalDate().toDate().getTime();
    



@Entity(primaryKeys = "date", "id")
public class DateSteakCrossRef 
    public long date;
    public int id;
    public boolean isCompleted;



public class DateWithSteaks 
    @Embedded Date date;

    @Relation(
            parentColumn = "date",
            entityColumn = "id",
            associateBy = @Junction(DateSteakCrossRef.class)
    )

    public List<Steak> steaks;

【问题讨论】:

你有没有找到任何合适的解决方案来解决这个问题? 【参考方案1】:

我遇到了同样的问题,无法通过直观的方式解决。

我得到的最接近解决方案的方法是将交叉引用实体(在您的示例 DateSteakCrossRef 中)作为一对多关系添加到结果对象 (DateWithSteaks) 中。

不是最好的事情,但至少你可以在一次事务中获取所有数据。

类似这样的:

public class DateWithSteaks 
    @Embedded Date date;
    @Relation(
            parentColumn = "date",
            entityColumn = "id",
            associateBy = @Junction(DateSteakCrossRef.class)
    )
    public List<Steak> steaks;
    @Relation(
        parentColumn = "id", // id of your Date clase
        entityColumn = "id"  // id of your DateSteakCrossRef class
    )
    public List<DateSteakCrossRef> steaksRefs;

然后,在您的代码中,您需要匹配 steakssteaksRefs 以映射到具有您需要的数据的另一个对象。

【讨论】:

以上是关于Android Room - 带有附加字段的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

DJANGO:与附加字段的多对多关系

Room 数据库中的多对多关系。 Kotlin Junction 类被忽略

Doctrine 2 和带有额外字段的多对多链接表

JPA 2:通过不在带有额外字段的多对多中工作来订购

带有额外列的多对多自引用原则

在 Django 中自动填充一组通用的多对多字段?