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);
}