首页 > 解决方案 > 房间表之间的关系 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 相对应的联系电话

标签: javaandroidandroid-room

解决方案


你有三种方法可以做到这一点。

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);

推荐阅读