我正在使用最近在 Google I/O 上宣布的 Android 架构组件中的 Android 房间持久性库。事情似乎正在工作,但我收到以下错误:
警告:tagId 列引用了外键,但它不是索引的一部分。每当修改父表时,这可能会触发全表扫描,因此强烈建议您创建覆盖该列的索引。
我的数据库有 3 个表:Note
、Tag
和JoinNotesTags
。Notes to Tags 是多对多关系,因此使用 JoinNotesTags 表来处理映射。表格很简单:
Note.id
并且Tag.id
都是主键JoinNotesTags.noteId
参考Note.id
JoinNotesTags.tagId
参考Tag.id
外键约束是在JoinNotesTags
表上定义的。作为参考,这里是表的CREATE TABLE
语句JoinNotesTags
:
"CREATE TABLE IF NOT EXISTS `JoinNotesTags` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`noteId` INTEGER,
`tagId` INTEGER,
FOREIGN KEY(`noteId`) REFERENCES `Note`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE ,
FOREIGN KEY(`tagId`) REFERENCES `Tag`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)"
这是@Entity
该类的相应注释:
@Entity(
indices = arrayOf(Index(value = *arrayOf("noteId", "tagId"), unique = true)),
foreignKeys = arrayOf(
ForeignKey(
entity = Note::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("noteId"),
onDelete = ForeignKey.CASCADE),
ForeignKey(
entity = Tag::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("tagId"))
)
)
从@Entity
注释中可以看出,tagId
与一起包含在复合唯一索引中noteId
。我已经确认在自动生成的 json 模式文件中也正确定义了这个索引:
"CREATE UNIQUE INDEX `index_JoinNotesTags_noteId_tagId`
ON `JoinNotesTags` (`noteId`, `tagId`)"
所以,我的问题是:这个警告只是(仍然是 alpha 版本的)房间库中的一个错误——即编译时分析缺少tagId
这个复合索引的一部分的事实吗?还是我真的有一个索引问题需要解决以避免全表扫描?