Android 房间关系一对多对多

恩里克·贝克尔

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

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

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

我需要用它的孩子来查询任务。目前我查询任务,然后查询项目,然后查询子项目,但我想让它更有效率。

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

伊塔马尔·克贝尔

Android Room 是一个非常简洁的 SQLite 包装器。我相信你已经知道了。我在这里假设您熟悉 SQL 和 join 语句。如果没有在这里阅读我这么说的原因是您实际上可以在 DAO 中编写您想要的任何内容,并且可以绕过执行许多 SQL 查询。

在您的情况下,您需要为 Task、Item 和 SubItem 定义 @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;
    }
}

您可以对 subItem 执行相同的操作。现在是 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);

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章