使用 Android 房间数据库在同一张表中的一对多关系

Posted

技术标签:

【中文标题】使用 Android 房间数据库在同一张表中的一对多关系【英文标题】:one to many relation within same table using Android Room Database 【发布时间】:2020-11-22 00:01:59 【问题描述】:

我正在尝试使用 android Room Database 在同一个表中创建一对多关系,我正在尝试创建一个名为 Task 的实体,它可以没有或有许多子任务,它也是 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】:

试试这个:

课堂任务

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

道法

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

P.S. 我怀疑您应该期望通过查询获得整个级别的结构。如果你有Task 子任务Task1Task2;并且Task1 有自己的子任务Task1_1,我认为您不会通过它获得Task1 子任务Task1_1,只需对主节点进行一次查询-Task。虽然你可以试试

【讨论】:

这里需要帮助 --> ***.com/questions/63243505/…

以上是关于使用 Android 房间数据库在同一张表中的一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何显示同一张表中的所有列

如何找出同一张表中特定状态的多个计数

在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

如何用通配符比较同一张表中的两条记录?