5

我得到了一个看起来像这样的 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、自定义设置器和数据类的解决方案。

4

2 回答 2

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')"
    }

}

但是我不建议在 Entity 中加密密码或以某种方式修改它,因为这不是它的责任,而且你可能会面临密码双重加密的错误,因为当你从数据库中检索实体时,Room 将使用将导致的数据填充实体对已经加密的数据进行加密。

于 2017-07-07T11:53:01.577 回答
-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
    }

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

于 2017-07-06T16:20:46.037 回答