2017-06-11 49 views
5

Używam Android Room Persistence Library ze składników architektury systemu Android ostatnio ogłaszanych w Google I/O. Wszystko wydaje się działać, ale ja otrzymuję następujący błąd:Ostrzeżenie dotyczące kompilacji w pokoju systemu Android dotyczące kolumny w kluczu obcym nie należy do indeksu. Co to znaczy?

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.

Moja baza danych ma 3 tabele: Note, Tag i JoinNotesTags. Uwagi do znaczników to relacja wiele do wielu, stąd tabela JoinNotesTags do obsługi odwzorowania. Tabele są proste:

  • Note.id i Tag.id są oba klucze podstawowe
  • JoinNotesTags.noteId referencje Note.id
  • JoinNotesTags.tagId referencje Tag.id

klucz obcy ograniczenia są zdefiniowane w tabeli JoinNotesTags. Dla porównania, tutaj jest oświadczenie CREATE TABLE na stole 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 
)" 

I tu jest odpowiedni @Entity adnotacji dla tej klasy:

@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")) 
     ) 
) 

Jak widać z @Entity adnotacji, tagIdjest zawarte w złożonym unikalnym indeksie wraz z noteId. Ustaliliśmy, że wskaźnik ten jest poprawnie zdefiniowana w pliku json auto generowane schematu, a także:

"CREATE UNIQUE INDEX `index_JoinNotesTags_noteId_tagId` 
    ON `JoinNotesTags` (`noteId`, `tagId`)" 

Więc moje pytanie: Czy to ostrzeżenie po prostu błąd w (jeszcze-alfa-release) Biblioteka pokoju - Czy analiza kompilacji nie uwzględnia faktu, że tagId jest częścią tego złożonego indeksu? Czy naprawdę mam problem z indeksowaniem, który muszę rozwiązać, aby uniknąć pełnego skanowania tabeli?

+0

Musimy zobaczyć twoje _ definicje_tabeli, nie twój kod Java. W szczególności, uważam, że błąd nie polega na tym, że kolumna 'tagId' nie ma indeksu, ale odnosi się do klucza obcego, który nie jest indeksowany. –

+0

@TimBiegeleisen, pytanie zaktualizowane o definicję tabeli dla "JoinNotesTags". Ale dla rekordu klucz 'Tag.id' jest kluczem podstawowym. Poza tym ostrzeżenie mówi, że problem dotyczy kolumny 'tagId' - a nie kolumny w tabeli nadrzędnej, do której się odnosi (' Tag.id'). – mikejonesguy

Odpowiedz

5

Po zmodyfikowaniu tabeli Tag baza danych może wymagać wyszukania odpowiednich wierszy tabeli JoinNotesTags. Aby być skutecznym, ten requires an index na kolumnie tagId.

Twój złożony indeks nie jest do tego przydatny; z powodu way how indexes work kolumna (y) do przeszukania musi być kolumną (-ami) skrajnej (-ami) w indeksie.

Powinieneś dodać indeks tylko do kolumny tagId. (Możesz zamienić kolejność kolumn w indeksie złożonym, ale wtedy masz taki sam problem z noteId.)

+4

Czy możesz dodać przykładową ilustrację – Idee