Комбинированный номер Первичный ключ ссылка на внешний ключ - PullRequest
0 голосов
/ 09 мая 2018

Я реализую приложение для Android с базой данных Room и у меня небольшой вопрос об отношениях в этой БД.

У меня есть две таблицы:

@Entity(tableName = "foods", primaryKeys = {"id", "language_id"},
        indices = {@Index(value = {"id", "language_id"}, unique = true)},
        inheritSuperIndices = true)
public class Food {

    @NonNull
    @ColumnInfo(name = "id")
    private String mId;

    @NonNull
    @ColumnInfo(name = "language_id")
    private String mLanguageId;

}

@Entity(tableName = "ingredients", primaryKeys = {"id", "language_id"},
        indices = {@Index(value = {"id", "language_id"}, unique = true), 
        @Index(value = {"food_id", "food_language_id"}, unique = true)},
        foreignKeys = {@ForeignKey(entity = Food.class, parentColumns ="id", 
        childColumns = "food_id", onUpdate = CASCADE, onDelete = CASCADE),
        @ForeignKey(entity = Food.class, parentColumns = "language_id", 
        childColumns = "food_language_id", onUpdate = CASCADE, onDelete = 
        CASCADE)},
        inheritSuperIndices = true)
public class Ingredient {

    @NonNull
    @ColumnInfo(name = "id")
    private String mId;

    @NonNull
    @ColumnInfo(name = "language_id")
    private String mLanguageId;

    @ColumnInfo(name = "food_id")
    private String mFoodId;

    @ColumnInfo(name = "food_language_id")
    private String mFoodLanguageId;

}

Обе таблицы «Пища» и «Ингредиент» имеют составные первичные ключи («id», «language_id»). Объект Food должен содержать список и, конечно, @ Relationship

public class FoodWithIngredients extends Food{

    @Relation(parentColumn = "id", entityColumn = "food_id", entity = 
    Ingredient.class)
    private List<Ingredient> mIngredients;

}

После того, как я попытаюсь запустить этот код, эти сообщения получили

Warnning:

Столбец food_language_id ссылается на внешний ключ, но он не является частью индекс. Это может вызвать полное сканирование таблицы, когда родительская таблица изменены, поэтому настоятельно рекомендуется создать индекс, который охватывает этот колонка.

Ошибка:

Ingredient has a foreign key (food_id) that references Food (id) but Food does not have a unique index on those columns nor the columns are its primary key. SQLite requires having a unique constraint on referenced parent columns so you must add a unique index to Food that has (id) column(s).

Может ли кто-нибудь помочь мне с этим?

Заранее спасибо:)

1 Ответ

0 голосов
/ 09 мая 2018

Хорошо, я нашел, где была моя ошибка. Мой @ForeignKey был неправ, правильный вот что:

@ForeignKey(
             entity = Food.class,
             parentColumns = {"id", "language_id"},
             childColumns = {"food_id", "food_language_id"},
             onUpdate = CASCADE, onDelete = CASCADE)

Разница в том, что я поместил несколько столбцов внутри 'parentColumns' и 'childColumns', и все работает правильно.

@ Danail Alexiev Прошивка примерно такая:

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertFoods(List<Food> foods);

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertIngredients(List<Ingredient> ingredients);

@Transaction
public void insertFoodData(List<Food> foods, RulesOfGolfDatabase database) {
    if (foods != null && database != null) {
        insertFoods(foods);
        for (Food food : foods) {
            insertIngredients(food.getIngrediants());
        }
    }
}

Самым важным здесь является то, что вы должны сначала вставить владельца @Relation (в данном примере это Food), а затем все данные, которые находятся в отношении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...