Kotlin的数据类,Android室和自定义setter
我有一个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,自定义设置器和数据类组合在一起的解决方案。
你可以尝试这样的事情:
@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中加密密码或者以某种方式修改它,因为它不是它的责任,并且当你从数据库中检索你的实体时,你可能会面对双重加密你的密码的错误。房间将会填充实体加密已经加密的数据。
@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 }
这将创建一个自定义设置器,所以每次你设置你的密码,你也可以在setter中进行加密。