Android 如果是PrimaryKey autoincrement,则DTO字段的值

Android 如果是PrimaryKey autoincrement,则DTO字段的值,android,kotlin,primary-key,android-room,Android,Kotlin,Primary Key,Android Room,在我的应用程序的房间数据库中,我有一个名为Messages的表,如下所示 @Entity(tableName = "messages") data class MessageDto( @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "client_message_id") var clientMessageId: Long, @ColumnInfo(name = "message_id") var

在我的应用程序的房间数据库中,我有一个名为Messages的表,如下所示

@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只存在于本地数据库中,所以我必须自己声明它。但既然它是自动递增的,我应该输入什么值呢


2我想用我创建的函数加密的列体。我使用类型转换器的方式正确吗?

当PK自动生成时,您不需要设置其值。您可以只插入实体而不设置pk,数据库将为您生成它,您还可以通过DAO检索生成的pk。例如,如果您有一个MessageDao,那么其中将包含以下方法:

@Insert
fun insertMessage(message: Message): Long
返回的long是您生成的PK


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

关于转换器,我了解。Thnx。但是,关于dto,当我将该dto设置为什么值时,我应该为该字段设置什么值?因为我必须放一些东西,因为它给了我一个错误。我不能忽略这个字段……如果它需要一个值,那么可以使用0。这样,Room就会知道您正在将值的创建委托给数据库。如果我想插入一条消息并获取Long,这样我就可以将它添加到另一个表对象的列中,我想插入它,我还必须使insertmessage挂起?我将提出一个新问题。谢谢