Android 如果是PrimaryKey autoincrement,则DTO字段的值
在我的应用程序的房间数据库中,我有一个名为Messages的表,如下所示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
@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挂起?我将提出一个新问题。谢谢