【问题标题】:How can I use @ForeignKeys in same table in Room database?如何在 Room 数据库的同一张表中使用 @ForeignKeys?
【发布时间】:2020-05-05 14:17:15
【问题描述】:

让我解释一下我的问题。这是我在 android studio 中的代码:

@Entity(tableName = "family_table",
        foreignKeys = @ForeignKey(entity = Person.class,parentColumns = "myId",childColumns = "parentId"))
public class Person {
    @PrimaryKey
    private long myId;
    private long parentId;

    private String name;
    private int age;
    private String gender;


    public Person( String name, int age, String gender) {
        this.myId = IdGenerator.generate();
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public void setMyId(long myId) {
        this.myId = myId;
    }
    public void setParentId(long parentId) {
        this.parentId = parentId;
    }
    public void setName(String name) {
        this.name = name;
    }

    public long getMyId() {
        return myId;
    }
    public long getParentId() {
        return parentId;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public String getGender() {
        return gender;
    }
}

现在我在数据库中创建了一些条目如下:

我想在同一个表中使用@ForeignKeys 注释。在代码中,我想用myId 列引用parentId。但是应用程序崩溃了。有什么建议吗?

【问题讨论】:

  • 我相信 ForeignKey 旨在提供任何关系数据库中两个表中的数据之间的链接。所以我不认为你可以为一张桌子做这个。您能否更具体地说明您想要这个的原因?
  • 我在 youtube 视频中看到建议可以使用外键来引用同一个表。我要制作一个家庭等级应用程序。其中每个条目都是 Person.class 的对象。每个人都有一个 ID(主键)和一个 parentId。父 ID 引用到其他人的 ID。因为我数据库中的每个条目都是 Person.class 的对象。所以只创建一个表(我命名为family_table)是合理的。但我找不到在同一张表中使用引用的任何方法。你能给我什么建议吗?
  • 好吧,这是有道理的。崩溃的原因是什么?日志猫说什么?
  • 我用的是long而不是Long。现在它可以工作了(见答案)。顺便说一句,Logcat 说:Caused by: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787 SQLITE_CONSTRAINT_FOREIGNKEY)。感谢您的帮助

标签: android database sqlite android-studio android-room


【解决方案1】:

我认为您以正确的方式完成了约束。 Sqlite (Room) 允许使用自引用外键。

但我想您在插入第一行带有空“parentId”的父行时遇到了问题(您使用“0”表示空的“父 id”,但它应该设置为“null”。否则你会得到关于违反约束的错误)。

尝试将类型“Long”更改为您的“parentId”而不是“long”。这将允许为字段“parentId”设置空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多