【问题标题】:No "NOT NULL" and "UNIQUE" constraint on Room Persistence Library房间持久性库上没有“NOT NULL”和“UNIQUE”约束
【发布时间】:2018-02-12 07:36:48
【问题描述】:

在使用 Room Persistence Library 时,我了解到没有任何方法可以设置具有 NOT NULL 和 UNIQUE 约束的数据类字段。 SQLite 是否支持这些约束。迁移使用这些约束的旧数据库不是问题吗?任何人都可以就这个问题提出建议吗?

【问题讨论】:

标签: android sqlite android-room


【解决方案1】:

对于可以为 null 的字段,您可以使用包装器原始类型 java。例如在您的房间表中使用整数实例 int。 如wrapper primitive type java,这可以为空,但原始类型类不能为空。并在为使用 notNull=true 但在生成 SQL 代码中使用 Integer 的原始字段生成此 SQL 代码时使用 notNull=false

【讨论】:

    【解决方案2】:

    如果您有多个要标记为唯一的项目并且基于您要插入到数据库中的项目,那么您可以使用复合主键。

    对于 Not null,Room 提供了“@NonNull”注释,该注释添加到不能为 null 的字段上。

    在下面提到的例如。每个班级的卷号是唯一的,但 2 个不同的班级可以有相同的卷号。所以我们可以使用 class & rollNumber 作为复合主键 & 在 db 中唯一插入。 示例:

        @Entity(primaryKeys = {"rollNumber", "class"})   
        class Student {
           @NonNull
            private int rollNumber;
            private String firstName;
            private String lastName;
            private int class;
            } 
    

    【讨论】:

      【解决方案3】:

      对于那些使用 Kotlin 的人,关于 NOT NULL 的补充回答:

      请注意,将类型标记为非可选会自动使其不为空(可选类型不会这样做)。

      您可以在数据库中使用@Database(exportSchema = true) 生成的架构中检查它。

      例如我有这样的事情:

      @Entity(tableName = "messages")
      data class Message (
              @PrimaryKey
              val messageId: UUID = UUID.randomUUID(),
              val date: Date = Date(),
              val receivedDate: Date? = null
      )
      

      在生成的架构中我可以阅读:

      "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `date` INTEGER NOT NULL, `receivedDate` INTEGER, PRIMARY KEY(`messageId`))"
      

      (注意:这里的日期类型是 Int,而 UUID 是字符串,因为我在其他地方使用了转换器)

      【讨论】:

        【解决方案4】:

        我知道没有任何方法可以设置具有 NOT NULL 和 UNIQUE 约束的数据类字段

        @Entity 字段上的@NonNull 注释将导致该字段的列应用NOT NULL

        @Index 上的unique=true 将强制执行唯一性约束(例如,@Entity(indices={@Index(value="something", unique=true)})。但是,您是正确的,不支持对列的普通 UNIQUE 约束,而不是通过索引。

        迁移使用这些约束的旧数据库不是问题吗?

        Room 并非旨在支持现有的数据库结构,尤其是在当前的alpha 状态下。随着时间的推移,我希望 Room 支持更高百分比的 SQLite 功能,但如果它达到 100%,我会感到震惊。

        【讨论】:

        • 感谢您对 Room 库如此了解。我有很多问题,我得到解决方案的总是你的答案:D
        • 我有点困惑。你能澄清一下我需要从哪个包@NonNull导入吗? android.support.annotationjavax.annotation ?
        • @Ifta:我会使用 android.support.annotation 之一,但希望 Room 注释处理器检查两者。
        • 科尔廷版本@Entity(tableName = "some_table", indices = [ Index(value = ["some_field"], unique = true) ])
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-29
        • 2018-05-27
        • 2018-01-22
        • 1970-01-01
        • 2016-08-13
        • 2021-05-09
        相关资源
        最近更新 更多