问题:与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.预先填充的表是正确的。
"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
}```发布于 2021-11-15 22:26:13
json文件中的模式是生成的,并且基于实体,更改它不会有什么区别。它甚至不是必需的(除非使用AutoMigration)。
预填充的数据库模式
是正确的,但是我不能让Android正确地更新以匹配:
您必须相应地更改实体或相应地转换预先填充的数据库。再次注意到实体定义了Room所期望的内容。
所用的语言与确切的答案有关。
有了Kotlin,Notes就可以是:-
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显示为:-
_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,允许同时使用/编译)可以是:-
@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将表创建为:-
_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 )");编译后生成的java是可用的。它在生成的java (使用Android )中的成员/类名中找到,与带有@Database带有_Impl后缀的类注释相同。语句本身在createAlltables方法中。
例如:-

https://stackoverflow.com/questions/69980301
复制相似问题