gpt4 book ai didi

Android Room 编译时警告关于外键中的列不是索引的一部分。这是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 21:54:33 45 4
gpt4 key购买 nike

我正在使用最近在 Google I/O 上宣布的 Android 架构组件中的 Android 房间持久性库。事情似乎正常,但我收到以下错误:

Warning:tagId column references a foreign key but it is not part of an index. This may trigger full table scans whenever parent table is modified so you are highly advised to create an index that covers this column.

我的数据库有 3 个表:NoteTagJoinNotesTags。 Notes to Tags 是多对多关系,因此使用 JoinNotesTags 表来处理映射。表格很简单:

  • Note.idTag.id 都是主键
  • JoinNotesTags.noteId 引用 Note.id
  • JoinNotesTags.tagId 引用 Tag.id

外键约束在 JoinNotesTags 表中定义。作为引用,这里是 JoinNotesTags 表的 CREATE TABLE 语句:

"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-release)房间库中的一个错误 - 即编译时分析缺少 tagId 是其中一部分的事实综合指数?还是我真的有需要解决的索引问题以避免全表扫描?

最佳答案

在 kotlin 代码中:

之前

@ColumnInfo(name = "question_id")
var questionId: Long

之后

@ColumnInfo(name = "question_id", index = true) //just add index = true
var questionId: Long

关于Android Room 编译时警告关于外键中的列不是索引的一部分。这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480761/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com