如何连接ROOM中的三个表

edw*_*rek 2 database android android-room

我需要加入三个Entities

1.

@Entity(tableName = "accounts") data class AccountModel(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    var name: String = "name",
    var currency: String = "currency",
    var number: String? = null,
    var color: Int = 0,
    var value: Double = 0.0,
    var start_value: Double = 0.0,
    var note: String? = null,
    var accountType: String? = null)
Run Code Online (Sandbox Code Playgroud)
@Entity(tableName = "categories")data class CategoryModel (
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null,
    var name: String,
    var color: Int,
    var is_income: Boolean
)
Run Code Online (Sandbox Code Playgroud)
@Entity(tableName = "transactions")
data class TransactionModel(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    var name: String? = null,
    var date: Long = 0L,
    var value: Double = 0.0,
    var account_id: Int? = null,          <-
    var category_id: Int? = null,         <-
    var description: String? = null,
    var is_income: Boolean = true
)
Run Code Online (Sandbox Code Playgroud)

它是什么类型的关系?我可以一对一。是一对多吗?我应该使用吗Junction?

ser*_*nov 6

这是一对一的关系。您可以添加下一个课程:

data class TransactionWithAccountAndCategory(
    @Embedded val transaction: Transaction,
    @Relation(
         parentColumn = "account_id",
         entityColumn = "id"
    )
    val account: AccountModel
    @Relation(
         parentColumn = "category_id",
         entityColumn = "id"
    )
    val category: CategoryModel
)
Run Code Online (Sandbox Code Playgroud)

并使用下一个方法获取它:

@Transaction
@Query("SELECT * FROM transactions")
fun getTransactions(): List<TransactionWithAccountAndCategory>
Run Code Online (Sandbox Code Playgroud)

因此,您不必使用Junction,因为只有与附加表的多对多关系才需要它(并且根据您的实体,您没有这种情况)。

  • 感谢您!我尝试做这样的事情,但可能我犯了一些语法错误。 (2认同)