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中进行加密。