【问题标题】:cannot be @Required or @NotNull不能是 @Required 或 @NotNull
【发布时间】:2018-02-01 03:04:30
【问题描述】:

使用REALM 的4.3.3 版本进行Android 开发时,出现以下错误:

Error: Field "groupName" with type "pizware.evaluapp.Models.Group" can not be @Required or @NotNull.

但我不会将任何这些标签用于任何字段。有谁知道怎么回事?

【问题讨论】:

  • 请粘贴您的代码
  • 如果你使用的是 kotlin,这意味着你有类似 var groupName: Group 而不是 var groupName: Group?

标签: java android-studio realm


【解决方案1】:

当您使用 Kotlin 时,Realm 会检查您的字段的可空性。

例如,

class Blah: RealmObject() {
    var group: Group? = null
}

那么group 不会得到隐含的@Required 注释。

如果你这样做了

class Blah: RealmObject() {
    var group: Group = Group()
}

这是行不通的,因为 Realm 不能保证单个链接的不可空性。所以它会抛出你得到的错误。

如果您想忽略这一点,因为例如您正在创建一个避免空值返回的支持字段

get() = group ?: Group()

然后你可以使用(从 4.1.0 开始):

kapt {
  arguments {
    arg("realm.ignoreKotlinNullability", true)
  }
}

在这种情况下,Realm 不会尝试隐式处理您的可空性(并将 Kotlin 可空性映射到字段的 @Required)。但只有在您真正知道自己在做什么时才应该使用它。

【讨论】:

  • 使用realm.ignoreKotlinNullability 参数有风险吗?当它说“Realm 不能保证单个链接的不可空性”时,它的真正含义是什么?
  • 表示Realm单链接在数据库中可以为空。因此,如果您访问托管 RealmObject 上它为 null 的字段,那么您将在运行时从 Kotlin 内在函数 notnull 获得 NPE。该参数主要用于允许非空支持字段,以便您可以拥有具有某些默认值的可空字段(公开为非空属性)。
  • 因此,在实践中,如果我的单个链接始终具有默认值(空对象)而不是 null,这不是问题。对吗?
  • 仅当您使用支持字段而不是默认值时
  • 不,你需要使用get() = group ?: Group()
猜你喜欢
  • 2018-02-02
  • 1970-01-01
  • 2016-08-24
  • 2021-06-02
  • 2020-03-10
  • 1970-01-01
  • 2015-05-18
  • 2013-05-17
  • 1970-01-01
相关资源
最近更新 更多