Android Room - Использование внешнего ключа в запросе - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть Component, который содержит внешний ключ, полученный из Component_category

Моя цель - отфильтровать список компонентов по выбранной категории компонентов.

Оба классаследующим образом:


Компонент

@Entity(tableName = "component_table", foreignKeys = {
        @ForeignKey(
            entity = Rack.class,
            parentColumns = "rack_id",
            childColumns = "component_id",
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
        ),
        @ForeignKey(
            entity = ComponentCat.class,
            parentColumns = "component_cat_id",
            childColumns = "component_id",
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
        )
})

public class Component {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "component_id")
    public int componentID;

    @NonNull
    @ColumnInfo(name = "component_name")
    private String componentName;

    // .. omitted

Категория компонента

@Entity(tableName = "component_cat_table")

public class ComponentCat
{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "component_cat_id")
    public int componentCatID;

    @NonNull
    @ColumnInfo(name = "component_cat_name")
    private String componentCatName;

    // .. omitted

Запрос

Я хочу свой запросбыть следующим:

 @Query("SELECT * from component_table " +
        "INNER JOIN component_cat_table " +
        "WHERE component_table.component_cat_id == :categoryID ORDER BY component_name ASC")
        LiveData<List<Component>> getFilteredComponents(int categoryID);

Но во время компиляции он говорит мне, что не может решить component_table.component_cat_id.Я также не могу установить имя для объекта с внешним ключом в моем классе Component.Я попробовал несколько вариантов, но я не знаю, как исправить запрос без «доступа» к внешнему ключу.

1 Ответ

0 голосов
/ 03 декабря 2018

Я случайно нашел ответ, спрятанный в примере проекта под названием «Постоянство Android».

Чтобы использовать внешний ключ, необходимо также определить столбец указанного внешнего ключа.Будет автоматически создана «ссылка» между столбцами и массивом внешних ключей.

   @Entity(foreignKeys = {
        @ForeignKey(entity = Book.class,
                parentColumns = "id",
                childColumns = "book_id"),

        @ForeignKey(entity = User.class,
                parentColumns = "id",
                childColumns = "user_id")})
@TypeConverters(DateConverter.class)
public class Loan {
    @PrimaryKey
    @NonNull
    public String id;

    public Date startTime;

    public Date endTime;

    @ColumnInfo(name="book_id")
    public String bookId;

    @ColumnInfo(name="user_id")
    public String userId;
}

Приведенный выше пример получен по следующей ссылке.

https://github.com/googlecodelabs/android-persistence/blob/master/app/src/main/java/com/example/android/persistence/codelab/db/Loan.java

...