我有一个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,自定义设置器和数据类的解决方案。
答案 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
}
这将创建一个自定义设置器,因此每次设置密码时,您都可以在设置器中对其进行加密。