Kotlin的数据类,Android Room和自定义setter

时间:2017-07-06 15:22:08

标签: android kotlin android-room

我有一个Android Room的实体,看起来像这样。到目前为止,不用担心。

@Entity(tableName = "users",
        indices = arrayOf(Index(value = "nickName", unique = true)))
data class User(@ColumnInfo(name = "nickName") var nickName: String,
                @ColumnInfo(name = "password") var password: String) {

    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0
}

现在我需要加密密码。使用Java,只需使用setter即可完成。

你如何用Kotlin做到这一点。我无法找到结合Android Room,自定义设置器和数据类的解决方案。

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

@Entity(tableName = "users",
        indices = arrayOf(Index(value = "nickName", unique = true)))
data class User(@ColumnInfo(name = "nickName") var nickName: String,
                private var _password: String) {

    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0

    @ColumnInfo(name = "password")
    var password: String = _password
        set(value) {
            field = "encrypted"
        }

    override fun toString(): String {
        return "User(id=$id, nickName='$nickName', password='$password')"
    }

}

但我不建议加密实体内部的密码或以某种方式修改密码,因为它不是它的责任,你可能会遇到密码双重加密的错误,因为当你从数据库中检索你的实体时,会用数据填充实体这将导致已加密数据的加密。

答案 1 :(得分:-5)

    @Entity(tableName = "users",
            indices = arrayOf(Index(value = "nickName", unique = true)))
    data class User(@ColumnInfo(name = "nickName") var nickName: String,
                    @ColumnInfo(name = "password") var password: String) {
    var _password = password
        set(value): String{
           //encrypt password
        }
        @ColumnInfo(name = "id")
        @PrimaryKey(autoGenerate = true)
        var id: Long = 0
    }

这将创建一个自定义设置器,因此每次设置密码时,您都可以在设置器中对其进行加密。