Android 房间数据库关系

问题描述 投票:0回答:1

我在 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数据库

android sqlite kotlin android-sqlite android-room
1个回答
0
投票

为了获得与示例相同的结果,在 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 的实体,现在如果它对您的应用程序有意义,您可以将它映射到一个模型,您将在应用程序的其他层中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.