Xii*_*ref 2 database android foreign-keys android-room
我想知道是否可以在有空间的外键上创建一个可能的空引用。
现在我的数据库结构是这样的:
@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;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够插入以下对象:
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)
Run Code Online (Sandbox Code Playgroud)
但是之前的空值插入给出了这个错误:FOREIGN KEY 约束失败(Sqlite 代码 787 SQLITE_CONSTRAINT_FOREIGNKEY)
有没有办法让它成为可能?
是的,只需将外键类型从 更改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;
}
Run Code Online (Sandbox Code Playgroud)
在 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
}
Run Code Online (Sandbox Code Playgroud)