房间实体中的内部字段(列)
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 中意外使用它。
我想将某些 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 中意外使用它。