我在 room android 中创建了一个包含三个实体的数据库
@Entity(tableName = "categories")
data class Category(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
val id: Int,
@ColumnInfo(name = "category_name")
val categoryName: String,
@ColumnInfo(name = "category_id")
val categoryId: Int
)
@Entity(tableName = "quotes")
data class Quote(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
val id: Int,
@ColumnInfo(name = "quote")
val quote: String,
@ColumnInfo(name = "category_id")
val categoryId: Int
)
@Entity(tableName = "favourites")
data class Favourite(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
val id: Int,
@ColumnInfo(name = "quote")
val quote: String,
@ColumnInfo(name = "category_name")
val categoryName: String,
// @ColumnInfo(name = "date")
// val date: Long
)
现在我的问题是我如何在这个例子中创建两个表之间的关系我想在
Category
和Quote
之间创建关系以便我可以按categoryId
订购报价。比如这条sql语句
SELECT * FROM quotes INNER JOIN categories ON quotes.category_id = categories.id WHERE categories.id = :categoryId
我浏览了官方文档,但它让我头疼,我不知道该怎么做。我不希望任何人为我编写代码我想要的是最简单的解释。
P.s 我是第一次接触Room数据库
为了获得与示例相同的结果,在 Quote 实体中删除字段 categoryId 并在 Category 实体中用 quoteId 替换字段 categoryId(您已经有一个字段 id),这样您就可以查询报价并查找其类别通过它的ID。 您可以创建另一个类,它将声明这样的关系:
data class QuoteAndCategoriesRelations(
@Embedded val quote: Quote,
@Relation(
parentColumn = "id",
entityColumn = "quoteId"
)
val categories: List<Category>
)
我把类别归档为一个列表,因为我不明白一个报价是否可以有一个以上的类别,如果不是这样就让它
val category: Category?
而不改变注释。
现在在你的 dao 中你可以声明下面的函数
@Transaction
@Query("SELECT * FROM quotes WHERE id = :quoteId")
suspend fun getQuoteAndCategoriesRelations(quoteId: Int): QuoteAndCategoriesRelations?
现在有了这个功能,您将获得一个带有字段 quote 和 category 的实体,现在如果它对您的应用程序有意义,您可以将它映射到一个模型,您将在应用程序的其他层中使用它。