android-room - 如何获取房间数据库中具有一对一关系的另一个表的行
问题描述
@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);
任何帮助将不胜感激
解决方案
如果您想获得 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);
推荐阅读
- google-chrome-extension - Chrome 扩展程序:“无法加载清单”,在上传的文件夹中找不到明确的文件
- javascript - toLocaleString() 在 Android 中不适用于 React Native
- git - Github 获取失败并出现错误:更新失败无法访问和 SSL_ERROR_SYSCALL
- android - FirebaseAuth getGoogleApiForMethod() 返回 Gms:com.google.firebase.auth.api.internal.zzao@1a8f272
- c# - 如何自动检查我没有忘记添加ef核心代码首先迁移
- r - 如果实例重复则变异
- c# - 列出所有 Shifts Graph API
- tensorflow - 将 roi_pooling 层的输出运行到 conv2d
- google-sheets - 需要在谷歌表格中使用查询来查找持续时间
- yocto - 如何验证 sstate-mirror 的使用情况?