【问题标题】:Best way to handle this relation in Room Database在房间数据库中处理这种关系的最佳方法
【发布时间】:2020-09-25 18:42:18
【问题描述】:

我有三个表,我在这里有一个多对多的关系:

联系表:

@Entity(tableName = "T_Contacts")
class Contact(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "_id") var id: Long,
@ColumnInfo(name = "phoneNumber")
var phoneNumber: String = "",

@ColumnInfo(name = "name")
var name: String = "",

@ColumnInfo(name = "active")
var active: Int = 1

@ColumnInfo(name = "contactId")
var contactId: Long = -1

@ColumnInfo(name = "phoneContactId")
var phoneContactId: String = ""

}

电子邮件表:

@Entity(tableName = "T_EmailAddress")
class EmailAddress(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "_id")
var id : Long,
@ColumnInfo(name="emailAddress")
var emailAddress: String,
@ColumnInfo(name="active")
var active : Int) {

}

还有关联表:

@Entity(tableName = "T_EmailAddressContact",
foreignKeys = [ForeignKey(
    entity = Contact::class,
    parentColumns = arrayOf("contactId"),
    childColumns = arrayOf("contactId"),
    onDelete=ForeignKey.CASCADE),
    ForeignKey(
        entity = EmailAddress::class,
        parentColumns = arrayOf("emailId"),
        childColumns = arrayOf("emailId"),
        onDelete=ForeignKey.CASCADE)]
  )
class EmailAddressContactCrossRef(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id")
var id: Long,
@ColumnInfo(name="contactId")
var contactId: Long,
@ColumnInfo(name="emailId")
var emailId : Long,
@ColumnInfo(name="active")
var active : Int ) {

如何使用关系获取所有电子邮件联系人的列表?我试过了:

data class EmailAddressContact(
@Embedded val contact: EmailAddress,
@Relation(parentColumn = "contactId",
    entityColumn = "contactId",
    associateBy = Junction(EmailAddressContactCrossRef::class)
)

val listContacts: List<Contact>
)

但这只会让我获得某个电子邮件地址的所有联系人列表。我想要这样的东西:

data class EmailAddressContact { 
    val id: Long,
    val emailAddress: EmailAddress,
    val contact: Contact,
    val active: Boolean

}

通过调用查询:

@Transaction
@Query("SELECT * FROM T_EmailAddressContact")
fun getAllEmailAddressAndContacts(): List<EmailAddressContact>

【问题讨论】:

    标签: android android-room database-relations


    【解决方案1】:

    根据您的EmailAddressContact 结构,您似乎不需要使用联结,只需使用关系。试试这个方法:

    data class EmailAddressContact(
        @Embedded val emailAddressContactCrossRef: EmailAddressContactCrossRef, // <- there you'll get "id" and "active" fields
        @Relation(
             parentColumn = "contactId",
             entityColumn = "contactId"
        )
        val contact: Contact,
        @Relation(
             parentColumn = "emailId",
             entityColumn = "_id"
        )
        val emailAddress: EmailAddress
    )
    

    并且您在问题中提到的查询应该适合

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多