【问题标题】:Nullable foreign key on room房间上可以为空的外键
【发布时间】:2019-06-07 10:37:17
【问题描述】:

我会知道是否可以在外键上创建一个可能的空引用和空间。

目前我的数据库结构是这样的:

@Entity(tableName = "A")
class A {
    @PrimaryKey(autoGenerate = true)
    public long id;
}

@Entity(tableName = "B")
class B{
    @PrimaryKey(autoGenerate = true)
    public long id;
}

@Entity(tableName = "C", foreignKeys = {@ForeignKey(entity = A.class, parentColumns = "id", childColumns = "foreign_id_a"), @ForeignKey(entity = B.class, parentColumns = "id", childColumns = "foreign_id_b")})
class C{
    public long id;
    public long foreign_id_a;
    public long foreign_id_b;   
}

我希望能够插入以下对象:

C(id=1, foreign_id_a=1, foreign_id_b=1)
C(id=1, foreign_id_a=null, foreign_id_b=1)
C(id=1, foreign_id_a=1, foreign_id_b=null)

但是之前的空值插入给出了这个错误: FOREIGN KEY 约束失败(Sqlite 代码 787 SQLITE_CONSTRAINT_FOREIGNKEY)

有没有办法让它成为可能?

【问题讨论】:

    标签: android database foreign-keys android-room


    【解决方案1】:

    是的,只需将外键类型从 long 更改为 Long

    在 Java 中,long 类型不能是 null,因此 Room 将此列生成为 NOT NULL。此外,C 类没有指定 @PrimaryKey

    @Entity(tableName = "C", foreignKeys = {@ForeignKey(entity = A.class, parentColumns = "id", childColumns = "foreign_id_a"), @ForeignKey(entity = B.class, parentColumns = "id", childColumns = "foreign_id_b")})
    class C{
        @PrimaryKey
        public long id;
        public Long foreign_id_a;
        public Long foreign_id_b;   
    }
    

    在 Kotlin 中,Long 类型是非空的。如果要插入可空外键,则需要将字段更改为可空类型Long?

    @Entity(tableName = "C", foreignKeys = [ForeignKey(entity = A::class, parentColumns = ["id"], childColumns = ["foreign_id_a"]), ForeignKey(entity = B::class, parentColumns = ["id"], childColumns = ["foreign_id_b"])])
    class C{
        @PrimaryKey
        var id: Long = 0
        var foreign_id_a: Long? = null
        var foreign_id_b: Long? = null
    }
    

    【讨论】:

    • 如果我们使用 Kotlin 会怎样?
    • @TheFedex87 你可以只使用可空类型Long?,请参阅编辑。
    • 我已经试过了,但是即使我用Long?并尝试使用空键我得到约束失败的错误
    • 那你可能有不同的问题。您是否插入具有多个外键的对象?如果您插入非空外键,您所引用的表中是否存在具有主键的对应行?
    猜你喜欢
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2014-07-17
    • 2014-01-17
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多