Java >> Programma Java >  >> Java

Problema di compilazione della stanza:la colonna fa riferimento a una chiave esterna ma non fa parte di un indice

Sono nuovo nello sviluppo di app per Android e sto creando un'app con Trips che memorizza le posizioni.

Ricevo un errore di compilazione:"la colonna trip_Id fa riferimento a una chiave esterna ma non fa parte di un indice. Ciò potrebbe attivare scansioni complete della tabella ogni volta che la tabella padre viene modificata, quindi ti consigliamo vivamente di creare un indice che copra questa colonna."

Ho 2 tabelle:Viaggio e Posizione.

Ho provato a indicizzare tripId e locationId nelle rispettive classi ma non risolve il problema.

Un viaggio ha il suo ID (PK), titolo, descrizione e priorità.

Una posizione ha il suo locationId (PK), tripId(FK), locationName e LatLng del luogo.

@Entity(tableName = "location_table",
        foreignKeys = @ForeignKey(entity = Trip.class, parentColumns = "location_Id", childColumns = "trip_Id"),
        indices = {@Index(value = {"locationId"}, unique = true)})
public class Location {

    @PrimaryKey(autoGenerate = true)
    private int locationId;

    @ColumnInfo (name = "trip_Id")
    private int tripId;

    private String locationName;

    @TypeConverters(LatLngConverter.class)
    private LatLng latLng;


@Entity(tableName = "trip_table", indices = {@Index(value = {"id"}, unique = true)})

public class Trip {

    @PrimaryKey(autoGenerate = true) // with each new row SQLite will automatically increment this ID so it will be unique
    @ColumnInfo (name = "location_Id")
    private int id;

    private String title;

    private String description;

    private int priority;

Non riesco a scoprire cosa c'è che non va

Risposta

Quel messaggio è un avviso, ci sarebbero altri errori (vedi 2a riga suggerita). es.

Usando indices = {@Index(value = {"locationId"}, unique = true),@Index(value = {"trip_Id"})}) dovrebbe superare quell'avvertimento.

COMUNQUE , non è necessario disporre di un indice (aggiuntivo) su locationId in quanto è già indicizzata essendo la chiave primaria (questo sarebbe uno spreco e anche inefficiente). Quindi si consiglia di utilizzare :-

indices = {@Index(value = {"trip_Id"})})

Credo che il tuo problema generale sia che ti riferisci al nome della variabile dell'oggetto per la colonna, se hai @ColumnInfo(name ="????") allora dovresti fare riferimento al nome dato

  • cioè ???? è il nome della colonna nella tabella sottostante.

Dovresti anche utilizzare location_Id invece di id nel Viaggio:-

@Entity(tableName = "trip_table", indices = {@Index(value = {"location_Id"}, unique = true)})

Etichetta Java