【发布时间】:2021-08-31 11:52:13
【问题描述】:
问题:在使用 Android Room 时,我在输入零 (0) 时在连接表上收到外键约束错误。我仍在努力学习 Android Room,所以我确定我忽略了文档和教程中的一些内容。
我的尝试:我确实有这个应用程序在使用 SQLite 的桌面版本中,我没有任何问题,并尝试将它设置为相同。我在这里和其他地方阅读了一些带有示例的帖子,甚至删除了将返回零的外键声明,但后来我遇到了模式开始完全在不同表上触发的困难。我尝试了默认值,但设置为 null 但似乎无法使其正常工作。在发这篇文章时,我仍然会重新阅读一些内容,但我确信我只是忽略了一些东西——旧的 80/20 规则。
我正在尝试做的事情: 这个连接表从 6 个表中捕获 id。但是,根据用户条目,有 3 个外键,用户可能没有添加任何要引用的内容。由于 Android Room 本质上是为了方便使用而包装了 SQLite,所以到目前为止,我还无法确定如何让它接受外键上的零值。我想过尝试OnConflict 注释,但想寻求一些想法和建议。
实体
@Entity(tableName = "Notes", foreignKeys = {
@ForeignKey(entity = Sources.class, parentColumns = "SourceID", childColumns = "SourceID"),
@ForeignKey(entity = Comments.class, parentColumns = "CommentID", childColumns = "CommentID"),
@ForeignKey(entity = Questions.class, parentColumns = "QuestionID", childColumns = "QuestionID"),
@ForeignKey(entity = Quotes.class, parentColumns = "QuoteID", childColumns = "QuoteID"),
@ForeignKey(entity = Terms.class, parentColumns = "TermID", childColumns = "TermID"),
@ForeignKey(entity = Topics.class, parentColumns = "TopicID", childColumns = "TopicID")},
indices = {@Index("SourceID"), @Index("CommentID"), @Index("QuestionID"), @Index("QuoteID"),
@Index("TermID"), @Index("TopicID")})
public class Notes {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "NoteID")
private int noteID;
@ColumnInfo(name = "SourceID")
private int sourceID;
@ColumnInfo(name = "CommentID")
private int commentID;
@ColumnInfo(name = "QuestionID", defaultValue = "0")
private int questionID;
@ColumnInfo(name = "QuoteID", defaultValue = "0")
private int quoteID;
@ColumnInfo(name = "TermID", defaultValue = "0")
private int termID;
@ColumnInfo(name = "TopicID")
private int topicID;
@ColumnInfo(name = "Deleted", defaultValue = "0")
private int deleted;
public Notes(int noteID, int sourceID, int commentID, int questionID, int quoteID, int termID, int topicID, int deleted){
this.noteID = noteID;
this.sourceID = sourceID;
this.commentID = commentID;
this.questionID = questionID;
this.quoteID = quoteID;
this.termID = termID;
this.topicID = topicID;
this.deleted = deleted;
}
架构部分
"tableName": "Notes",
"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 DEFAULT 0, `QuoteID` INTEGER NOT NULL DEFAULT 0, `TermID` INTEGER NOT NULL DEFAULT 0, `TopicID` INTEGER NOT NULL, `Deleted` INTEGER NOT NULL DEFAULT 0, FOREIGN KEY(`SourceID`) REFERENCES `Sources`(`SourceID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`CommentID`) REFERENCES `Comments`(`CommentID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`QuestionID`) REFERENCES `Questions`(`QuestionID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`QuoteID`) REFERENCES `Quotes`(`QuoteID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`TermID`) REFERENCES `Terms`(`TermID`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`TopicID`) REFERENCES `Topics`(`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,
"defaultValue": "0"
},
{
"fieldPath": "quoteID",
"columnName": "QuoteID",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "termID",
"columnName": "TermID",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "topicID",
"columnName": "TopicID",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "deleted",
"columnName": "Deleted",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"columnNames": [
"NoteID"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_Notes_SourceID",
"unique": false,
"columnNames": [
"SourceID"
],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Notes_SourceID` ON `${TABLE_NAME}` (`SourceID`)"
},
{
"name": "index_Notes_CommentID",
"unique": false,
"columnNames": [
"CommentID"
],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Notes_CommentID` ON `${TABLE_NAME}` (`CommentID`)"
},
{
"name": "index_Notes_QuestionID",
"unique": false,
"columnNames": [
"QuestionID"
],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Notes_QuestionID` ON `${TABLE_NAME}` (`QuestionID`)"
},
{
"name": "index_Notes_QuoteID",
"unique": false,
"columnNames": [
"QuoteID"
],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Notes_QuoteID` ON `${TABLE_NAME}` (`QuoteID`)"
},
{
"name": "index_Notes_TermID",
"unique": false,
"columnNames": [
"TermID"
],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Notes_TermID` ON `${TABLE_NAME}` (`TermID`)"
},
{
"name": "index_Notes_TopicID",
"unique": false,
"columnNames": [
"TopicID"
],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Notes_TopicID` ON `${TABLE_NAME}` (`TopicID`)"
}
],
"foreignKeys": [
{
"table": "Sources",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"SourceID"
],
"referencedColumns": [
"SourceID"
]
},
{
"table": "Comments",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"CommentID"
],
"referencedColumns": [
"CommentID"
]
},
{
"table": "Questions",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"QuestionID"
],
"referencedColumns": [
"QuestionID"
]
},
{
"table": "Quotes",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"QuoteID"
],
"referencedColumns": [
"QuoteID"
]
},
{
"table": "Terms",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"TermID"
],
"referencedColumns": [
"TermID"
]
},
{
"table": "Topics",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"TopicID"
],
"referencedColumns": [
"TopicID"
]
}
]
},
【问题讨论】:
标签: android foreign-keys android-room