【问题标题】:Value of DTO field if is PrimaryKey autoincrement如果是 PrimaryKey 自动增量,则 DTO 字段的值
【发布时间】:2020-02-07 18:49:58
【问题描述】:

在我的应用程序的房间数据库中,我有一个名为 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 仅存在于本地数据库中,我必须将其声明为 mySelf。但是由于它的 autoIncrement 我应该输入什么值?

2) 我想用我创建的函数加密的列体。我拥有 TypeConverters 的方式是否正确?

【问题讨论】:

    标签: android kotlin primary-key android-room


    【解决方案1】:

    自动生成 PK 时,您无需设置其值。您可以直接插入实体而不设置 pk,数据库将为您生成它,您也可以通过 DAO 检索生成的 PK。例如,假设您有一个 MessageDao,您将在其中包含以下方法:

    @Insert
    fun insertMessage(message: Message): Long
    

    返回的 long 就是你生成的 PK。

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

    【讨论】:

    • 关于我理解的转换器。谢谢。但是,关于 dto,当我将 Dto 设为该字段时,我应该为该字段添加什么值?因为我必须放一些东西,因为它给了我一个错误。我不能忽视这个领域......
    • 如果它需要一个值,那么您可以使用 0(零)。这样一来,Room 就会知道您正在将值的创建委托给数据库
    • 如果我想插入一条消息并获取 Long 以便我可以将它添加到另一个我想插入它的表对象的列中,我还必须暂停插入(消息)?
    • 我会提出一个新问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多