首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Android列从notNull=true更新到notNull=false?

如何将Android列从notNull=true更新到notNull=false?
EN

Stack Overflow用户
提问于 2021-11-15 20:12:56
回答 1查看 607关注 0票数 1

问题:与Android,它使用预先填充的数据库,我似乎不能让表列从notNull=true更改为notNull=false?预填充的数据库架构是正确的,但我无法让Android正确地更新以匹配:

我所做的:编辑了json文件,删除了特定列的NOT NULL,并在fields下将相同的字段列信息更新为"notNull": false。我尝试了一个迁移,不知道它是否正确,使用ALTER TABLE Notes ADD COLUMN 'QuestionID' INTEGER,它实际上再次将json文件更新为NOT NULL。我似乎找不到关于怎么做的信息?Entity没有这些注释,我也不确定是否有必要在Entity中定义这些注释,因为这个DB有没有这些注释的其他表,而且它们没有问题地通过编译。我敢肯定这是另一个80/20的规则,我是愚蠢的,而且遗漏了一些东西。

示例表中的json文件的问题,引号,术语和删除的字段需要是notNull=false,并继续更改回true.预先填充的表是正确的。

代码语言:javascript
复制
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`NoteID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `SourceID` INTEGER NOT NULL, `CommentID` INTEGER NOT NULL, `QuestionID` INTEGER NOT NULL, `QuoteID` INTEGER NOT NULL, `TermID` INTEGER NOT NULL, `TopicID` INTEGER NOT NULL, `Deleted` INTEGER NOT NULL, FOREIGN KEY(`SourceID`) REFERENCES `Source`(`SourceID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`CommentID`) REFERENCES `Comment`(`CommentID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`TopicID`) REFERENCES `Topic`(`TopicID`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
        "fields": [
          {
            "fieldPath": "noteID",
            "columnName": "NoteID",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "sourceID",
            "columnName": "SourceID",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "commentID",
            "columnName": "CommentID",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "questionID",
            "columnName": "QuestionID",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "quoteID",
            "columnName": "QuoteID",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "termID",
            "columnName": "TermID",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "topicID",
            "columnName": "TopicID",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "deleted",
            "columnName": "Deleted",
            "affinity": "INTEGER",
            "notNull": true
          }```
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-15 22:26:13

json文件中的模式是生成的,并且基于实体,更改它不会有什么区别。它甚至不是必需的(除非使用AutoMigration)。

预填充的数据库模式

是正确的,但是我不能让Android正确地更新以匹配:

您必须相应地更改实体或相应地转换预先填充的数据库。再次注意到实体定义了Room所期望的内容。

所用的语言与确切的答案有关。

有了Kotlin,Notes就可以是:-

代码语言:javascript
复制
data class Note(
    @PrimaryKey(autoGenerate = true)
    val NoteId: Long,
    val SourceID: Long?,
    val CommentID: Long?,
    val QuestionID: Long?,
    val QuoteID: Long?,
    val TermID: Long, //<<<<< NOT NULL 
    val TopicID: Long?,
    val Deleted: Long?
)

生成的java然后将表create显示为:-

代码语言:javascript
复制
_db.execSQL("CREATE TABLE IF NOT EXISTS `Note` (`NoteId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `SourceID` INTEGER, `CommentID` INTEGER, `QuestionID` INTEGER, `QuoteID` INTEGER, `TermID` INTEGER NOT NULL, `TopicID` INTEGER, `Deleted` INTEGER, FOREIGN KEY(`SourceID`) REFERENCES `Source`(`SourceID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`CommentID`) REFERENCES `Comment`(`CommentID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`TopicID`) REFERENCES `Topic`(`TopicID`) ON UPDATE NO ACTION ON DELETE NO ACTION )");

也就是那些长的?不具有NULL ( TermID列不具有NULL而不是Long )?使用)。

对于Java,列类型不能是允许null的原始类型,因为这些类型必须有值,不能为空,因此Room将派生NOT NULL。只是对象类型(例如,长,不长)将作为NULL允许的。要强制NotNull,则需要使用@NotNull注释。

因此,Java等效(命名为JavaNote,允许同时使用/编译)可以是:-

代码语言:javascript
复制
@Entity(
        foreignKeys = {
                @ForeignKey(entity = Source.class,parentColumns = {"SourceID"},childColumns = {"SourceID"}),
                @ForeignKey(entity = Comment.class,parentColumns = {"CommentID"},childColumns = {"CommentID"}),
                @ForeignKey(entity = Topic.class,parentColumns = {"TopicID"}, childColumns = {"TopicID"})
        }
)
class JavaNote {
    @PrimaryKey(autoGenerate = true)
    long NoteID=0; // primitives cannot be NULL thus imply NOT NULL
    Long SourceID;
    Long CommentID;
    Long QuestionID;
    Long QuoteID;
    @NotNull
    Long TermID; // or long TermID
    Long TopicID;
    Long Deleted;
}

生成的java将表创建为:-

代码语言:javascript
复制
_db.execSQL("CREATE TABLE IF NOT EXISTS `JavaNote` (`NoteID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `SourceID` INTEGER, `CommentID` INTEGER, `QuestionID` INTEGER, `QuoteID` INTEGER, `TermID` INTEGER NOT NULL, `TopicID` INTEGER, `Deleted` INTEGER, FOREIGN KEY(`SourceID`) REFERENCES `Source`(`SourceID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`CommentID`) REFERENCES `Comment`(`CommentID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`TopicID`) REFERENCES `Topic`(`TopicID`) ON UPDATE NO ACTION ON DELETE NO ACTION )");

  • 又一次对TermID进行了有目的的编码,以使用非空

编译后生成的java是可用的。它在生成的java (使用Android )中的成员/类名中找到,与带有@Database带有_Impl后缀的类注释相同。语句本身在createAlltables方法中。

例如:-

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69980301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档