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

时间:2019-11-14 08:42:30

标签: android database sqlite rx-java rx-java2

我具有一对多关系的数据库表,因为我现在只想获取在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()字段返回空列表

1 个答案:

答案 0 :(得分:0)

首先,您应该正确命名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有一对多的关系,所以我猜{{1中应该有对PCLass的ID的引用}}。因此,您的CClass应该如下所示:

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的资源,该资源具有您关注的 pid

CClass

然后,您将能够调用此DAO函数并获取您所关注的PClass ID的CClass。如果您使用实际模型的名称而不是此PClass和CClass,将会容易得多。

另一件事,恕我直言,DAO应该是界面,而不是抽象类