房间实体中的内部字段(列)

Internal fileds (columns) in Room's Entity

我想将某些 Room 实体的属性标记为内部属性。例如

@Entity(tableName = "users")
class User {
    // ...
    @ColumnInfo(name = "admin_id")
    internal var adminId: String? = null
}

但是,这会产生如下编译错误: Error:(10, 1) error: Cannot find getter for field.

实现此功能的唯一方法似乎是使用 lateinit 修饰符,但是,它不能用于可为空的原始字段。

我试过 "hack": 具有内部 getter/setter 的私有字段,但这也不起作用。

编译生成的版本显然为生成的方法(setAdminId$sdk_debug)添加了一些后缀,这些后缀不适用于空间。 "lateinited" 字段的 setters/getters 也有此后缀,但字段本身保持不变 public.

有什么方法可以使列成为内部列吗?

它似乎在最新的 Room 2.5.0-alpha01

中得到了支持

旧答案:我没有解决这个问题,我必须定义一组新的实体和它们之间的映射器。

内部名称被 Kotlin 破坏了,所以我通过确保 @JvmName:

使用正确的名称来让它工作
@Entity(tableName = "users")
class User {
    // ...
    @ColumnInfo(name = "admin_id")
    @get:JvmName("adminId")
    internal var adminId: String? = null
}

注意:这可能会更容易从 Java 中意外使用它。