DTO字段的值,如果是PrimaryKey自动递增

问题描述 投票:0回答:1

在我的应用程序的房间数据库中,我有一个称为消息的表,如下所示。

@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的方式正确吗?

android kotlin primary-key android-room
1个回答
1
投票

自动生成PK时,无需设置其值。您只需插入您的实体而无需设置pk,数据库将为您生成它,您还可以通过DAO检索生成的PK。例如,假设您有一个MessageDao,您将在其中使用此方法:

@Insert
fun insertMessage(message: Message): Long

返回的long是您生成的PK。

关于类型转换器:转换器被认为可用于复杂的数据类型,例如日期,它们应将对象从一种类型转换为另一种。在您的情况下,我知道您正在将一个String转换为另一个String。这不适用于类型转换器,但是您可以在将字符串设置为实体之前对其进行加密。例如,如果您使用的是干净的体系结构,则存储库将调用db数据源,而db数据源将是委派用来加密和解密字段的数据库。

© www.soinside.com 2019 - 2024. All rights reserved.