我有以下实体:
@Entity(indices = {@Index("address")},
foreignKeys = @ForeignKey(
entity = Address.class,
parentColumns = "address",
childColumns = "address",
onUpdate = CASCADE,
onDelete = SET_DEFAULT))
public class Human {
@PrimaryKey(autoGenerate = true)
public long id;
@NonNull
public String name;
@NonNull
public String address;
}
@Entity
public class Address {
@PrimaryKey
@NonNull
public String address;
public int someInt;
}
我添加了具有不同地址的“人”,稍后我尝试使用以下方式删除或编辑:
@Insert(onConflict = REPLACE)
void add(Human human);
我看到的选项和它们的问题:
我有一个地址列表,其中一个是“默认”。当我删除一个地址时,我希望居住在被删除地址的“人类”“移动”到“默认”。 我用过:
@Query("delete from Address where address = :address") void deleteAddress(String address);
所以 onDelete = SET_DEFAULT 似乎并没有像我想象的那样工作,如果我在人类实体中设置一个默认值来解决。
当前失败并显示:NOT NULL 约束失败。
删除的替代方法是编辑地址并将其设置为“默认”,从而与现有的“默认”条目合并。 我试过:
@Query("update Address SET address = :address WHERE address = :addressToEdit") void editAddress(String addressToEdit, String newAddress);
这当前失败了:UNIQUE 约束失败。因为已经有一个同名的地址,显然。
在两个实体中将地址设置为@Nullable。这样,“默认”地址为空。这给我的解决方案增加了额外的复杂性(我不喜欢它),而且我似乎无法使用以下代码查询具有空地址的 Humans,因为它不返回任何内容。
@Query("select * from Human where address = :address") LiveData<List<Human>> getHumans(String address);
我怎样才能将此设置设为默认的已删除地址(外键)?
最佳答案
我建议修改您的地址实体并添加 id 字段作为整数自动递增。然后在人类实体中,您可以通过 id 字段引用地址。因此,在删除地址记录之前,您可以更新使用要删除的引用的人员记录,默认引用 ID 例如:1 然后您可以通过其 ID 删除此地址记录。在这里您可以解决地址唯一性约束问题。
关于android - 房间 : deleting a ForeignKey or setting the ForeignKey to a default value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52936981/