android - 房间 : deleting a ForeignKey or setting the ForeignKey to a default value

标签 android sql sqlite foreign-keys android-room

我有以下实体:

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

我看到的选项和它们的问题:

  1. 我有一个地址列表,其中一个是“默认”。当我删除一个地址时,我希望居住在被删除地址的“人类”“移动”到“默认”。 我用过:

    @Query("delete from Address where address = :address")
    void deleteAddress(String address);
    

所以 onDelete = SET_DEFAULT 似乎并没有像我想象的那样工作,如果我在人类实体中设置一个默认值来解决。

当前失败并显示:NOT NULL 约束失败。

  1. 删除的替代方法是编辑地址并将其设置为“默认”,从而与现有的“默认”条目合并。 我试过:

    @Query("update Address SET address = :address WHERE address = :addressToEdit")
    void editAddress(String addressToEdit, String newAddress);
    

这当前失败了:UNIQUE 约束失败。因为已经有一个同名的地址,显然。

  1. 在两个实体中将地址设置为@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/

相关文章:

android - 如何在 Android 中显示自定义 View ?

android - 即使授予了权限,访问 'storage/0/emulated/download' 路径时也被拒绝权限

java - Activity 暂停时更新适配器数据

android - 我可以为 Google Play UI 测试定义场景吗?

java - 在运行通用图像加载器时添加 imageUrl?

sql - 与 SQL 中的 STUFF 等效的函数(MySQL 中的 GROUP_CONCAT/Oracle 中的 LISTAGG)

php - 如何将这些查询添加在一起(Yii2)?

java - Visualvm 中的自拍时间比其他时间长

python - 如何从数据库查询中删除列表中的嵌套列表?

android - 我如何使用 onListItem 来启动具有 ListView 值的新 Activity ?