2017-06-11 39 views
5

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.idTag.id đều khóa chính
  • JoinNotesTags.noteId tài liệu tham khảo Note.id
  • JoinNotesTags.tagId tài liệu tham khảo Tag.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 đượ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?

+0

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. –

+0

@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

Trả lời

5

Khi bạn sửa đổi bảng Tag, cơ sở dữ liệu có thể cần tra cứu các hàng tương ứng trong bảng JoinNotesTags. Để có hiệu quả, điều này requires an index trên cột tagId.

Chỉ mục tổng hợp của bạn không hữu ích cho điều đó; vì số way how indexes work, (các) cột được tìm kiếm phải là cột ngoài cùng bên trái trong chỉ mục.

Bạn nên thêm chỉ mục vào chỉ cột tagId. (Bạn có thể hoán đổi thứ tự của các cột trong chỉ mục tổng hợp, nhưng sau đó bạn có cùng một vấn đề với noteId.)

+4

Bạn có thể thêm hình minh họa mẫu không – Idee

Các vấn đề liên quan