Как получить счетчик родительского внешнего ключа из дочерней таблицы, используя Room - PullRequest
0 голосов
/ 24 июня 2018

У меня есть родительская сущность Collection:

@Entity(tableName = "collections")
public class Collection implements Serializable {

    @PrimaryKey
    @NonNull
    public String id;

    public String collTitle;

    public int isFavorite;

    public int wordCount;

    Collection(String collTitle, int isFavorite, int wordCount) {
        this(UUID.randomUUID().toString(), collTitle, isFavorite, wordCount);
    }

    @Ignore
    Collection(@NonNull String id, String collTitle, int isFavorite, int wordCount) {
        this.id = id;
        this.collTitle = collTitle;
        this.isFavorite = isFavorite;
        this.wordCount = wordCount;
    }

}

и дочерняя сущность Word:

@Entity(tableName = "words",
        foreignKeys = @ForeignKey(
                entity = Collection.class,
                parentColumns = "id",
                childColumns = "collId",
                onDelete = SET_DEFAULT),
        indices = @Index("collId"))
public class Word implements Serializable {

    @PrimaryKey
    @NonNull
    public final String id;

    public String wordTitle;

    public String collId;

    public String pageNum;

    public int isFavorite;

    public String wordNotes;

    @Ignore
    Word(String wordTitle, String collId, String pageNum, int isFavorite, String wordNotes) {
        this(UUID.randomUUID().toString(), wordTitle, collId, pageNum, isFavorite, wordNotes);
    }

    Word(@NonNull String id, String wordTitle, String collId, String pageNum, int isFavorite,
         String wordNotes) {
        this.id = id;
        this.wordTitle = wordTitle;
        this.collId = collId;
        this.pageNum = pageNum;
        this.isFavorite = isFavorite;
        this.wordNotes = wordNotes;
    }
}

Во время вставки новой коллекции я даю wordCount как 0, потому что каждыйНовая коллекция будет иметь 0 слов, связанных с ним.Однако при вставке нового Word мне нужно выбрать одну коллекцию из определенных коллекций и использовать ее 'id' как 'collId' (внешний ключ).

Теперь мне нужно получить список объектов Collection сПоле «wordCount», содержащее фактическое количество слов, связанных с каждым объектом коллекции.Как уже упоминалось, поле 'wordCount' присваивается значение 0 во время вставки объекта Collection.

Я просто надеюсь, что прояснил свой вопрос.Пожалуйста, предложите запрос, который служит моей цели.И я не хочу иметь результат в виде нового класса POJO, например, CollectionsAndWords.

Любая помощь будет очень полезна!

1 Ответ

0 голосов
/ 25 июня 2018

ОК, я решил это следующим образом:

В своей сущности Collection я аннотировал wordCount следующим образом:

@ColumnInfo(name = "word_count")
    public int wordCount;

и внес изменения в конструкторы, удалив это поле:

Collection(String collTitle, int isFavorite) {
        this(UUID.randomUUID().toString(), collTitle, isFavorite);
    }

@Ignore
Collection(@NonNull String id, String collTitle, int isFavorite) {
        this.id = id;
        this.collTitle = collTitle;
        this.isFavorite = isFavorite;
   }

Наконец, я добавил следующий метод запроса в свой DAO:

@Query("SELECT collections.id, collections.collTitle, collections.isFavorite, " +
            "COUNT(words.collId) as word_count " +
            "FROM collections " +
            "LEFT JOIN words " +
            "ON collections.id = words.collId " +
            "GROUP BY collections.id " +
            "ORDER BY collections.collTitle")
List<Collection> findAllCollsWithCount();

Правильно использованный LEFT JOIN помог мне.

Обратите внимание, что в приведенном выше запросе я не получаю поле wordCount, я просто позволяю вычислять новое поле и отображать его в wordCount.Если я получаю wordCount вместе с другими столбцами из таблицы коллекций, я получаю 02 столбца, которые идут под именем word_count;один со значением 0, а другой с вычисленным значением (COUNT ()).Я также пытался аннотировать wordCount с помощью @Ignore, но затем Room не смог найти ни одного столбца для сопоставления word_count.

Однако на данный момент вышеприведенное решение отлично подходит для моей цели, так что это ответ.Это может помочь кому-то с таким же вопросом.

Спасибо!

...