Android房间关系一对多对多

Android Room Relation One-to-Many-to-Many

我正在使用 Room Library 开发 Android 应用程序。

该应用有 3 个实体,如任务、项目和子项目。

一个任务有一个或多个项目,一个项目有一个或多个子项目。

我需要查询任务及其子项。目前我查询任务,然后查询项目,然后查询子项目,但我想让它更有效率。

我已经读过这个https://developer.android.com/reference/android/arch/persistence/room/Relation,但我不知道如何编码这个关系。

Android Room 是 SQLite 的一个非常整洁的包装。我相信你已经知道了。 我在这里假设您熟悉 SQL 和 join 语句。 如果没有阅读 here。 我这么说的原因是你实际上可以在 DAO 中写任何你想写的东西,然后到处做很多 SQL 查询。

在您的情况下,您需要为任务、项目和子项目定义@Enitity。 然后你需要定义它们之间的关系,即Item中Task的外键是什么,SubItem中Item的外键是什么

示例: 我凭记忆写的,没有编译,所以可能有一些错误,但应该可以。

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

}