使用Android Room Database在同一张表中一对多关系

时间:2020-08-01 09:29:23

标签: android android-room one-to-many

我正在尝试使用Android Room Database在同一张表中创建一对多关系,我正在尝试创建一个名为Task的实体,该实体可以不包含任何子任务,也可以不包含许多子任务,该任务也属于Task类型,代码实体任务如下

package com.xxxxx.xxxxx.xxxx;


import androidx.room.Embedded;
import androidx.room.Entity;
import androidx.room.Index;
import androidx.room.PrimaryKey;



@Entity(tableName = "task_table", indices = {@Index(value = "id", unique = true)})
public class Task {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String description;

    @Embedded
    private Task parentTask;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Task getParentTask() {
        return parentTask;
    }

    public void setParentTask(Task parentTask) {
        this.parentTask = parentTask;
    }

}

编译时,在编译时会引发如下错误:

Recursive referencing through @Embedded and/or @Relation detected: com.xxxxx.xxxxx.xxxx.Task -> com.xxxxx.xxxxx.xxxx.Task.

还有其他方法可以使用Android Room Database在同一张表中创建一对多关系吗?

对不起,我的英语不是我的母语。

1 个答案:

答案 0 :(得分:1)

尝试一下:

课堂任务

@Entity(tableName = "task_table", indices = {@Index(value = "id", unique = true)})
public class Task {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String description;

    private Int parentId; // <- here you should put parent Id, or null if there is no parent

    ........
}

关系类

public class TaskWithSubtasks{
    @Embedded
    Task task;
    
    @Relation(
        parentColumn = "id",
        entityColumn = "parentId"
    )
    List<Task> subTasks;
}

Dao方法

@Query("SELECT * FROM task where id =:id")
TaskWithSubtasks getTaskWithSubTasks(int id);

PS 。我怀疑您应该期望通过查询获得整个级别的结构。如果您有Task个子任务Task1Task2;并且Task1有自己的子任务Task1_1,我认为您仅通过一次对主节点的查询就不会获得Task1子任务Task1_1-{{1} }。虽然可以尝试