java - 房间表之间的关系 Android
问题描述
我正在开发一个聊天应用程序。我有两个实体
@Entity(tableName = "messages")
public class MessageItem {
@PrimaryKey
private Integer msgId;
@ColumnInfo(name = "from_id")
private String contact_id;
}
和
@Entity(tableName = "contact")
public class Contact{
@PrimaryKey
private Integer id;
@ColumnInfo(name = "contact_phone")
private String phone;
}
在 MessageDao 中,我想获取与 MessageItem 中的 contact_id 相对应的联系电话
解决方案
你有三种方法可以做到这一点。
1)您可以使用带有@Embedded 和@Relation 的POJO,在这种情况下,您可以使用联系人返回MessageItem,例如:-
public class MessageItemWithContact {
@Embedded
MessageItem messageItem;
@Relation(entity = Contact.class, parentColumn = "from_id", entityColumn = "id")
Contact contact;
}
以及@Query,例如:-
@Transaction
@Query("SELECT * FROM messages WHERE msgId=:msgId")
MessageItemWithContact getMessageByIdWithContact(int msgId);
2)或者您可以使用带有@Embedded 的 POJO 和使用 JOIN 的电话附加变量,例如:-
public class MessageItemWithPhone {
@Embedded
MessageItem messageItem;
String phone;
}
除了@Query 之类的:-
@Query("SELECT msgId, contact_phone, from_id FROM messages JOIN contact On from_id = id ")
List<MessageItemWithPhone> getMessItemWithContactPhone();
- 不需要@Transaction,因为查询是单个事务(而前面的方法 Room 获取 MessageItem 然后构建查询以获取相关对象)。
- 此查询获取所有 MessageItems(因为没有包含 WHERE 子句)
3)只需使用相关 MessageItem 的 from_Id 获取电话,而无需 POJO,方法是使用 @Query 如下:-
@Query("SELECT contact_phone FROM contact WHERE id=:from_Id")
String getPhoneById(String from_Id);
推荐阅读
- amazon-web-services - AWS:在不同账户中使用 Kinesis Firehose 读取 Kinesis Stream 数据
- postgresql - 在 PostgreSQL 视图中包含一个 TIMESTAMP = NOW() 列
- javascript - 如何在javascript中将音频添加到10秒倒计时
- python - python嵌套while循环和日期时间
- python - Pygame 密钥约定
- node.js - 后端单元测试使用mocha和chai,每次测试前如何清库
- javascript - 在javascript中克隆数组时遇到问题,做出反应
- javascript - 如何在 JavaScript 中检查给定日期是本周还是上周
- mysql - SQL 交集错误 ERROR 1064 (42000):
- python - 如何在 matplotlib 工具栏中设置鼠标坐标的大小?