在我的应用程序的房间数据库中,我有一个称为消息的表,如下所示。
@Entity(tableName = "messages")
data class MessageDto(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "client_message_id")
var clientMessageId: Long,
@ColumnInfo(name = "message_id")
var messageId: Long = 0L,
@TypeConverters(EncryptString.Converter::class)
@ColumnInfo(name = "body", defaultValue = "")
var body: String,
@ColumnInfo(name = "msg_type")
var msgType: Int = 0,
@ColumnInfo(name = "message_date", defaultValue = "")
var messageDate: String,
.........
)
所以可以说我想向数据库中插入一条新消息。我创建一个MessageDto对象,然后将其插入。
val messageDto = MessageDto(
newClientMessageId,
item.messageId,
item.body,
item.msgType,
item.msgDate
...)
messageDao.insert(messageDto)
1)由于PK仅存在于本地数据库中,因此我必须将其声明为mySelf。但是由于其autoIncrement应该输入什么值?
2)我想使用我创建的函数对列主体进行加密。我拥有TypeConverters的方式正确吗?
自动生成PK时,无需设置其值。您只需插入您的实体而无需设置pk,数据库将为您生成它,您还可以通过DAO检索生成的PK。例如,假设您有一个MessageDao,您将在其中使用此方法:
@Insert
fun insertMessage(message: Message): Long
返回的long是您生成的PK。
关于类型转换器:转换器被认为可用于复杂的数据类型,例如日期,它们应将对象从一种类型转换为另一种。在您的情况下,我知道您正在将一个String转换为另一个String。这不适用于类型转换器,但是您可以在将字符串设置为实体之前对其进行加密。例如,如果您使用的是干净的体系结构,则存储库将调用db数据源,而db数据源将是委派用来加密和解密字段的数据库。