首页 > 解决方案 > 如何获取房间数据库中具有一对一关系的另一个表的行

问题描述

@Entity(tableName = "expenseCat")
public class ExpenseCatEntity {
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String category;





@Entity(tableName = "expenseDetails")
public class ExpenseDetailsEntity {
    @PrimaryKey(autoGenerate = true)
    private int detailsId;
    private int expenseCatId;
    private String notes;
    private String amount;
    private String date;





public class CatWithDetails {
    @Embedded
    public ExpenseCatEntity cat;
    @Relation(
            parentColumn = "id",
            entityColumn = "expenseCatId"
    )
    public ExpenseDetailsEntity details;

}

数据库中有数据的两个表的图像

我想从第一个表中获取类别名称,从第二个表中获取其他详细信息。所以当我通过 detailsId =2 我应该得到这样的: DAMAGE mobile 8000 02 Jun 2020

但无论我通过什么细节,我总是得到:DAMAGE Lotion 450 2020 年 6 月 3 日

下面是我在 Dao 中的代码

    @Transaction
    @Query("SELECT * FROM expenseCat AS c INNER JOIN expenseDetails AS d ON  c.id = d.expenseCatId WHERE d.detailsId = :id")
    CatWithDetails getCatAndDetailsById(int id); 

任何帮助将不胜感激

标签: android-room

解决方案


如果您想获得 ExpenseDetailsEntity (可能不是,但这是您的问题):

@Query("SELECT * FROM expenseDetails WHERE detailsId = : detailsId")
public List<ExpenseDetailsEntity> getExpenseDetailsById(int detailsId);

如果您打算获取 CatWithDetails,则无法以通常的方式(使用 Relation)在 ExpenseDetailsEntity 上设置过滤器,因此您必须使用表的连接:

@Query("SELECT expenseCat.id, expenseDetails.detailsId, expenseDetails. expenseCatId FROM expenseCat INNER JOIN expenseDetails ON expenseCat.id = expenseDetails.expenseCatID WHERE expenseDetails.detailsId = :detailsId")
public List<CatWithDetails> getCatWithDetailsById(int detailsId);

更新

如果您将 CatWithDetails 更改为:

public class CatWithDetails {
    @Embedded
    public ExpenseDetailsEntity details;
    @Relation(
            parentColumn = "expenseCatId",
            entityColumn = "id"
    )
    public ExpenseCatEntity cat;
}

那么您可以将 Relation 与条件和查询一起使用:

@Query("SELECT * FROM expenseDetails WHERE detailsId = : detailsId")
CatWithDetails getCatWithDetailsById(int detailsId);

推荐阅读