【问题标题】:Room is there any way to not insert/update value if null如果为空,房间有什么办法不插入/更新值
【发布时间】:2021-01-12 18:48:39
【问题描述】:

我最近开始使用 Room,我想知道在插入或更新实体时是否有任何方法可以检查值是否为空,在这种情况下,不要插入/更新它。

我想要做的是类似的事情

@Entity
data class Person{
    @PrimaryKey
    val id: Int,
    val name:String
    val surname:String
 }

是否有可能以一种简单的方式对那些不为空的字段执行@Update 操作?而那些为空的则保持原样?

例如,在一次更新中,我可能已经告知了身份证和姓名,但在另一次更新中,我可能已经告知了身份证和姓氏。所以我想要的是合并信息,但如果可能的话,不必进行选择查询来检查存储的值。

我已经阅读了following post,但我怀疑是否可以定义一个@Entity,将所有字段定义为我之前提到的字段,然后让其他实体只更新一些字段,类似:

 @Entity(tableName = "person")
data class PersonUpdateSurname{
    @PrimaryKey
    val id: Int,
    val name:String
 }


@Entity(tableName = "person")
data class PersonUpdateSurname{
    @PrimaryKey
    val id: Int,
    val surname:String
 }

有没有办法告诉 Room 原来的表结构是什么?

【问题讨论】:

    标签: android database kotlin android-sqlite android-room


    【解决方案1】:

    有没有办法告诉 Room 原来的表结构是什么?

    这个问题不清楚。可能你有什么误解。

    尝试遵循下一个架构:

    1. 应该只有一个Person 相关的数据类使用Room-annotations 进行注释——@Entity、@PrimaryKey 等等。在您的情况下,它是 Person 类。
    2. 所有其余提到的辅助类都应该只是 POJO(普通数据类),因为它们没有被持久化。在您的情况下 - PersonName 和 PersoneSurname(带有您描述的字段,但没有 Room 的注释)。
    3. 在 DAO 中,在 @Update 中使用 entity-参数:
    @Update(entity = Person::class)
    fun updateName(personName: PersonName)
    
    @Update(entity = Person::class)
    fun updateSurname(personeSurname: PersonSurname)
    

    在您的存储库调用方法中您需要什么。如果您只想更新名称 - 您使用方法 updateName() 和 PersonName 类的实例作为参数,仅更新姓氏 - 方法 updateSurname() 和类实例 PersonSurname。

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 2020-06-21
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多