【问题标题】:Kotlin: @Ignore'd properties persisted by Sugar ORMKotlin:Sugar ORM 保留了 @Ignore 的属性
【发布时间】:2016-10-29 17:46:17
【问题描述】:

在我的 Android 应用中,我将 Kotlin 与 SugarORM 结合使用,但在尝试阻止某些属性被持久化时遇到了问题。具有讽刺意味的是,@com.orm.dsl.Ignore 注解在 Kotlin 类中使用时似乎被忽略了。

举个例子,

1) 让我们声明两个看似相同的模型:

// JavaUser.java
public class JavaUser extends SugarRecord {
    public String login = "login";
    @Ignore public String password = "password";
}

// KotlinUser.kt
class KotlinUser : SugarRecord() {
    var login: String = "login"
    @Ignore var password: String = "password"
}

2) 持久化他们的实例

JavaUser().save()
KotlinUser().save()

3) 并查看实际持久化的内容:

sqlite> select * from java_user;
ID|LOGIN
1|login

sqlite> select * from kotlin_user;
ID|LOGIN|PASSWORD
1|login|password

我意识到这可能与 Kotlin 注释处理有关,但我只是不确定如何去做。欢迎提出任何建议。

【问题讨论】:

  • 我试图深入研究 Sugar ORM 源​​(这里是 the most relevant part)并重现您的问题以查看 Sugar ORM 内部发生了什么。但是,令人惊讶的是,getTableFieldsKotlinUser 类上调用时只返回 login 字段。您能否重新检查问题是否真的存在于 Sugar ORM 中持续存在KotlinUser::password?也许条目来自以前的一些运行......
  • 好吧,我实际上从头开始创建了一个新项目来重现此行为。对于它的价值,这是source;我还应用了@voddan 的两个解决方案。

标签: android kotlin sugarorm


【解决方案1】:

Java 和 Kotlin 代码之间的核心区别在于,在 Java 中使用字段,而在 Kotlin 中使用属性。请参阅文档中的 Properties and Fields 部分。

您可以尝试以下解决方案,看看哪些方案最适合 SugarORM:

1。让 Kotlin 公开字段:

@Ignore @JvmField var password: String = "password"

2。将您的注释应用到私有支持字段:

@field:Ignore var password: String = "password"

【讨论】:

  • 据我所知,@Ignore 的目标是FIELD,所以它应该隐式应用于该字段,而不指定@field:
  • 是的,请查看this gist
  • 此时,在我看来,问题不在@Ignore 中(详情请参阅我对问题的评论)。
  • 我尝试了第一种方法,但没有帮助。但定位成功了。
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2020-03-22
  • 2011-09-03
  • 2022-01-15
相关资源
最近更新 更多