房间数据库中具有一对多关系的 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<CClass> cClassList
字段返回空列表,但我想完全忽略来自'ClassDao#getAll()
的记录
【问题讨论】:
你想得到一个PojoClass
,其中c_id
(外键)与你提供的值相匹配吗?
不,现在我得到了预期的代码结果。但我想忽略 CClass 中没有对应 PClass raw 匹配记录的记录。
我已经添加了更多有问题的解释,请阅读
哪些类具有一对多关系? 匹配记录是什么意思?我假设你想通过id
s 匹配,因此主键和外键?
是的,感谢您抽出宝贵时间,但我想我没能让您完全理解我的问题,我会更新这个问题的更多细节。
【参考方案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;
并且由于您说您有从PClass
到CClass
的一对多关系,我想应该在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 子句的主要内容,如果未能解决你的问题,请参考以下文章