房间数据库中具有一对多关系的 Where 子句

Posted

技术标签:

【中文标题】房间数据库中具有一对多关系的 Where 子句【英文标题】:Where clause with one to many relation in room database 【发布时间】:2020-03-10 03:56:26 【问题描述】:

我有一对多关系的数据库表,现在我只想获取在CClass 表中包含至少一个匹配记录的记录。

这是我的 PojoClass,我在其中定义了两者之间的关系

public class PojoClass 

    @Embedded
    PClass pClass;

    @Relation(
        parentColumn = "cid",
        entityColumn = "cid",
        entity = CClass.class)
    List<CClass> cClassList;


PClass.java

@Entity(tableName = "p_class")
public class PClass 
    @PrimaryKey(autoGenerate = true)
    @NonNull
    @ColumnInfo(name = "cid")
    private long cid;
    @ColumnInfo(name = "rid")
    private String rid;

CClass.java

@Entity(tableName = "c_class",
        foreignKeys = @ForeignKey(entity = PClass.class,
        parentColumns = "cid",
        childColumns = "cid",
        onDelete = ForeignKey.CASCADE))
public class CClass 

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name="cid")
    @NonNull
    private long cid;

    @ColumnInfo(name = "rid")
    private long rid;

和道

@Dao
public abstract class ClassDao 

    @Query("SELECT * FROM PClass")
    public abstract Single<List<PojoClass>> getAll();

此代码运行良好,但我想忽略 CClass 中没有匹配原始数据的原始数据。现在ClassDao#getAll() 在没有数据时为PojoClass#List&lt;CClass&gt; cClassList 字段返回空列表,但我想完全忽略来自'ClassDao#getAll() 的记录

【问题讨论】:

你想得到一个PojoClass ,其中c_id(外键)与你提供的值相匹配吗? 不,现在我得到了预期的代码结果。但我想忽略 CClass 中没有对应 PClass raw 匹配记录的记录。 我已经添加了更多有问题的解释,请阅读 哪些类具有一对多关系匹配记录是什么意思?我假设你想通过ids 匹配,因此主键和外键? 是的,感谢您抽出宝贵时间,但我想我没能让您完全理解我的问题,我会更新这个问题的更多细节。 【参考方案1】:

首先,您应该正确命名您的 id 变量。 id 变量可以是简单的 id,它是主键,也可以是 id 以外的东西,例如实体上的 c_id,它是外键.

所以将您的PClass.java 编辑为:

@Entity(tableName = "p_class")
public class PClass 
    @PrimaryKey(autoGenerate = true)
    @NonNull
    @ColumnInfo(name = "id")
    private long id;
    @ColumnInfo(name = "rid")
    private String rid;

并且由于您说您有从PClassCClass 的一对多关系,我想应该在CClass 中引用PCLass 的ID。所以你的CClass.java 应该是这样的:

@Entity(tableName = "c_class",
        foreignKeys = @ForeignKey(entity = PClass.class,
        parentColumns = "id",
        childColumns = "pid",
        onDelete = ForeignKey.CASCADE))
public class CClass 

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name="id")
    @NonNull
    private long id;

    @ColumnInfo(name = "rid")
    private long rid;

    @ColumnInfo(name = "pid")
    private long pid;

另一件事我不知道rid 是什么。 现在获取代表 CClass 的资源,它具有您关心的 pid

    @Query("SELECT * FROM c_class WHERE pid = :pId")
    public CClass getCClassForPClass(long pId);

然后您将能够调用此 DAO 函数并获取您关心的 PClass id 的 CClass。如果你有实际模型的名称而不是这个 PClass 和 CClass,会容易得多。

另外,IMHO DAO 应该是接口而不是抽象类

【讨论】:

是的,我知道它应该是接口,但是我有一些代码,所以抽象类而不是接口,并且名称只是为了演示,因为原始代码要在这里发布要大得多。我会尽快更新我的问题。 我认为你可以通过使用一些图表来更好地提出问题:) 是的,我正在考虑,会尽力而为

以上是关于房间数据库中具有一对多关系的 Where 子句的主要内容,如果未能解决你的问题,请参考以下文章

使用 Android 房间数据库在同一张表中的一对多关系

linq 到实体,where 子句中的 where ? (内凡)

没有关系的房间中的一对多关系

如何获取核心数据中关系的关系?

获取 MAX(date) < X 的数据

Oracle:在 Where 子句中使用 Case 语句