【问题标题】:Internal fileds (columns) in Room's Entity房间实体中的内部字段(列)
【发布时间】:2022-02-24 16:57:54
【问题描述】:

我想将某些 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”字段的 setter/getter 也有这个后缀,但该字段本身保持公开状态。

有什么办法可以让列变成内部的吗?

【问题讨论】:

  • 为什么要内部化?
  • 因为它是不应暴露给其他开发人员的内部字段。当然,我可以创建一些其他类并在每次返回或接收对象时进行映射,但这要复杂得多,效率也低得多,只是一个内部修饰符。
  • 不幸的是,这是你必须做的。只需创建另一个层,从 Room 获取数据并将您的原始对象转换为另一个。
  • 我也想做同样的事情(将实体标记为内部),很遗憾它不受支持

标签: kotlin android-room


【解决方案1】:

它似乎在最新的Room 2.5.0-alpha01得到支持


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

【讨论】:

    【解决方案2】:

    内部名称被 Kotlin 弄乱了,所以我通过确保与 @JvmName 一起使用正确的名称来使其工作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 2020-01-31
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多