Комната Android Отношение один ко многим ко многим - PullRequest
0 голосов
/ 04 октября 2018

Я занимаюсь разработкой приложения для Android с использованием Библиотеки комнат.

Приложение имеет 3 сущности, такие как задача, элемент и подэлемент.

Одна задача имеет один или несколько элементов, а один элемент имеет один или несколько подэлементов.

Мне нужнозапросить задачу со своими детьми.В данный момент я запрашиваю задачу, затем запрашиваю элементы, затем запрашиваю подэлементы, но хочу сделать ее более эффективной.

Я уже читал это https://developer.android.com/reference/android/arch/persistence/room/Relation,, но я не знаю, как закодировать это отношение.

1 Ответ

0 голосов
/ 05 октября 2018

Android Room - очень аккуратная оболочка для SQLite.Я уверен, что вы уже знали это.Я предполагаю, что вы знакомы с SQL и операторами объединения.если не прочитано здесь .Причина, по которой я говорю, заключается в том, что вы действительно можете написать все, что хотите, в DAO и обойтись, выполняя множество SQL-запросов.

В вашем случае вам нужно определить @Enitity для Task, Item & SubItem.Затем вам нужно определить отношения между ними, то есть внешний ключ Задачи в Элементе и внешний ключ Элемента в Подэлементе.

Пример: Я написал это по памятибез компиляции, поэтому у меня может быть несколько ошибок, но это должно сработать.

import android.arch.persistence.room.Entity;
import android.arch.persistence.room.ForeignKey;
import android.arch.persistence.room.PrimaryKey;

import static android.arch.persistence.room.ForeignKey.CASCADE;

@Entity(foreignKeys = @ForeignKey(entity = Task.class,
                                  parentColumns = "id",
                                  childColumns = "taskId",
                                  onDelete = CASCADE))
public class Item {
    @PrimaryKey public final int id;
    public final int taskId;

    public Item(final int id, final int userId) {
        this.id = id;
        this.userId = userId;
    }
}

Вы можете сделать то же самое для подэлемента.Теперь для DAO.

public interface DAO {

    @Query("SELECT * from " + 
        "(LEFT JOIN item ON task.id = item.taskId) " +
        "LEFT JOIN sub_item ON item.id = sub_item.itemId " + 
        "WHERE task.id=:id")
    List getTask(int id);

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