51 votes

Avertissement de compilation d'Android Room sur la colonne de la clé étrangère ne faisant pas partie d'un index. Qu'est-ce que ça veut dire?

Je suis sur Android la Chambre de la Persistance de la Bibliothèque à partir de l'Android Composants de l'Architecture a récemment annoncé à la Google I/O. les Choses semblent être au travail, mais j'obtiens l'erreur suivante:

Avertissement:tagId les références de colonne de clé étrangère, mais il ne fait pas partie d'un index. Cela peut déclencher des analyses de tables complètes à chaque fois que la table parent est modifié de sorte que vous êtes fortement conseillé de créer un index qui couvre ce la colonne.

Ma base de données dispose de 3 tables: Note, Tag, et JoinNotesTags. Notes de Tags est un plusieurs-à-plusieurs relations, d'où le JoinNotesTags tableau pour gérer la cartographie. Les tables sont simples:

  • Note.id et Tag.id sont à la fois des clés primaires
  • JoinNotesTags.noteId références Note.id
  • JoinNotesTags.tagId références Tag.id

Les contraintes de clé étrangère sont définis sur l' JoinNotesTags table. Pour référence, voici l' CREATE TABLE déclaration pour l' JoinNotesTags tableau:

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

Et voici la correspondante @Entity d'annotation pour la classe:

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

Comme vous pouvez le voir à partir de la @Entity d'annotation, tagId est inclus dans un composite index unique avec noteId. J'ai confirmé que cet indice est correctement défini dans l'auto-générés json fichier de schéma ainsi:

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

Donc, ma question: Est-ce l'avertissement juste un bug dans l' (encore en version alpha) Salle de la Bibliothèque -- c'est à dire le moment de la compilation de l'analyse est de manquer le fait qu' tagId fait partie de cet indice composite? Ou dois-je vraiment une indexation problème que je dois résoudre, afin d'éviter des analyses de tables complètes?

64voto

arjava Points 24

en code kotlin:

avant

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

après

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

50voto

nag prakash Points 145

Vous devez ajouter un index aux colonnes pour des requêtes plus rapides Voici un exemple

 @Entity(indices = {@Index("artist_id")})
public class Artist{
    @NonNull
    @PrimaryKey
    @ColumnInfo(name = "artist_id")
    public String id;
    public String name;
}
 

21voto

CL. Points 46451

Lorsque vous modifiez l' Tag tableau, la base de données pourriez avoir besoin pour la recherche de lignes correspondantes dans l' JoinNotesTags table. Pour être efficace, cela implique un indice sur l' tagId colonne.

Votre indice composite n'est pas utile pour que, à cause de la manière dont les indices de travail, la colonne(s) à rechercher doit être la colonne la plus à gauche(s) dans l'index.

Vous devez ajouter un index sur seulement l' tagIdcolonne. (Vous pourriez changer l'ordre des colonnes dans l'indice composite, mais ensuite, vous auriez le même problème avec noteId.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X