在 Kotlin 中使用 Room 的 @ForeignKey 作为 @Entity 参数

Posted

技术标签:

【中文标题】在 Kotlin 中使用 Room 的 @ForeignKey 作为 @Entity 参数【英文标题】:Using Room's @ForeignKey as @Entity parameter in Kotlin 【发布时间】:2018-08-31 01:17:15 【问题描述】:

我遇到了一个 Room tutorial,它在类定义中使用了 @PrimaryKey 注释:

@Entity(foreignKeys = @ForeignKey(entity = User.class,
                              parentColumns = "id",
                              childColumns = "userId",
                              onDelete = CASCADE))
public class Repo 
    ...

现在,我有以下要使用主键的数据类:

@Parcel(Parcel.Serialization.BEAN) 
data class Foo @ParcelConstructor constructor(var stringOne: String,
                                              var stringTwo: String,
                                              var stringThree: String): BaseFoo() 

    ...

所以,我只是在顶部添加了@Entity(tableName = "Foo", foreignKeys = @ForeignKey(entity = Bar::class, parentColumns = "someCol", childColumns = "someOtherCol", onDelete = CASCADE))sn-p,但我无法编译:

注解不能用作注解参数。

我想知道:(我认为是)为什么相同的概念在 Java 中起作用,但在 Kotlin 中却不起作用?另外,有没有办法解决这个问题?

欢迎所有输入。

【问题讨论】:

【参考方案1】:

这是提供您正在寻找的注解的方式,带有用于参数的显式数组,并且没有 @ 用于创建嵌套注解:

@Entity(tableName = "Foo", 
    foreignKeys = arrayOf(
            ForeignKey(entity = Bar::class, 
                    parentColumns = arrayOf("someCol"), 
                    childColumns = arrayOf("someOtherCol"), 
                    onDelete = CASCADE)))

由于Kotlin 1.2,你也可以使用数组字面量:

@Entity(tableName = "Foo",
    foreignKeys = [
        ForeignKey(entity = Bar::class,
                parentColumns = ["someCol"],
                childColumns = ["someOtherCol"],
                onDelete = CASCADE)])

【讨论】:

someCol 是您的示例 Foo 类的一部分,而 someOtherCol 是 xlass BAr 的一部分? 其实反过来。子列来自当前实体(本例中为 Foo),父列来自另一个实体(本例中为 Bar)。

以上是关于在 Kotlin 中使用 Room 的 @ForeignKey 作为 @Entity 参数的主要内容,如果未能解决你的问题,请参考以下文章

上手使用 Room Kotlin API

kotlin 升级到 1.6.0 后如何在 Room Dao 中使用挂起修饰符?

Room Kotlin 找不到字段的设置器

Kotlin:如何将对象列表插入到 Room 中?

Android:如何使 Kotlin 中所有对象列表的类型转换器(用于 Room)通用

找不到类,使用 Android Studio 3.0.1、Room、Kotlin 的 androidTest 中的空测试套件