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
iTag.id
są oba klucze podstawoweJoinNotesTags.noteId
referencjeNote.id
JoinNotesTags.tagId
referencjeTag.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, tagId
jest 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?
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. –
@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