Tôi đang sử dụng Thư viện Persistence Room của Android từ Android Architecture Components gần đây đã được công bố tại Google I/O. Mọi thứ dường như làm việc, nhưng tôi nhận được lỗi sau:Cảnh báo thời gian biên dịch của Android về cột ở khóa ngoài không phải là một phần của chỉ mục. Nó có nghĩa là gì?
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.
cơ sở dữ liệu của tôi có 3 bảng: Note
, Tag
, và JoinNotesTags
. Ghi chú cho Thẻ là mối quan hệ nhiều-nhiều, do đó bảng JoinNotesTags để xử lý ánh xạ. Các bảng là đơn giản:
Note.id
vàTag.id
đều khóa chínhJoinNotesTags.noteId
tài liệu tham khảoNote.id
JoinNotesTags.tagId
tài liệu tham khảoTag.id
các ràng buộc khoá ngoại được xác định trên bảng JoinNotesTags
. Để tham khảo, đây là báo cáo kết quả CREATE TABLE
cho bảng 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
)"
Và đây là tương ứng @Entity
chú thích cho lớp đó:
@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"))
)
)
Như bạn có thể nhìn thấy từ @Entity
chú thích, tagId
là được bao gồm trong chỉ mục duy nhất tổng hợp cùng với noteId
. Tôi xác nhận rằng chỉ số này được xác định một cách chính xác trong file schema json tự động tạo ra cũng như:
"CREATE UNIQUE INDEX `index_JoinNotesTags_noteId_tagId`
ON `JoinNotesTags` (`noteId`, `tagId`)"
Vì vậy, câu hỏi của tôi: Liệu cảnh báo này chỉ là một lỗi trong (vẫn còn-alpha-release) Thư viện Phòng - tức là phân tích thời gian biên dịch thiếu thực tế là tagId
là một phần của chỉ mục tổng hợp này? Hay tôi thực sự có vấn đề về lập chỉ mục mà tôi cần giải quyết để tránh quét toàn bộ bảng?
Chúng tôi cần xem định nghĩa _table_ của bạn, chứ không phải mã Java của bạn. Cụ thể, tôi tin rằng lỗi không phải là cột 'tagId' không có chỉ mục, nhưng nó chỉ một khóa ngoại không được lập chỉ mục. –
@TimBiegeleisen, câu hỏi được cập nhật để bao gồm định nghĩa bảng cho 'JoinNotesTags'. Nhưng đối với bản ghi, 'Tag.id' là khóa chính. Bên cạnh đó, cảnh báo cho biết vấn đề là với cột 'tagId' - không phải cột trong bảng cha mà nó tham chiếu (' Tag.id'). – mikejonesguy