【问题标题】:How to perform cascade deleting on foreign key using ormlite in android如何在android中使用ormlite对外键执行级联删除
【发布时间】:2014-10-10 12:55:34
【问题描述】:

我在 android 中使用 ormlite,并已成功创建表并使用 DAO 执行不同的操作。

但是如果从主表中删除主键,我一直在删除外键行。

我有两个名为 Parent 和 child 的表。父母有多个孩子,所以我将孩子与外键联系起来。

代码:
父表:

@DatabaseField(id = true)
private Integer id;

@ForeignCollectionField(eager = false)
private ForeignCollection<Child> childCollection;

子表:

@DatabaseField(id = true)
private Integer id;

@DatabaseField(foreign = true, foreignAutoRefresh = true, canBeNull = false,
   index = true, columnDefinition = "INTEGER REFERENCES parent(id) ON DELETE CASCADE")
private Parent parent;

现在,如果我要删除特定 ID 的父行,那么这不会从子表中删除子行。

public void deleteById(Integer parentId) {
    try {
        Dao<Parent, Integer> parentDao = databaseHelper.getParentDao();
        parentDao .deleteById(parentId);

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

请指导我,我做错了什么。我已经多次尝试和谷歌,但没有运气。

【问题讨论】:

    标签: android database orm android-sqlite ormlite


    【解决方案1】:

    您可能已经找到了解决方案,但可能有人需要这个。 根据BaseForeignCollection源代码,解决方案可能如下:

    parent.getChildren().clear();
    Dao<Parent, Integer> parentDao = databaseHelper.getParentDao();
    parentDao.delete(parent);
    

    实际上,您可以为父级实现自己的 dao 并覆盖删除方法,如下所示:

    @Override
    public int delete(final Parent data) throws SQLException {
        data.getChildren().clear();
        return super.delete(data);
    }
    

    在这种情况下可能就足够了。

    【讨论】:

      【解决方案2】:

      你应该使用constraint,比如:

      @DatabaseField (  
         foreign = true, 
         foreignAutoRefresh = true, 
         canBeNull = false,
         index = true, 
         columnDefinition = "INTEGER CONSTRAINT FK_NAME REFERENCES parent(id) ON DELETE CASCADE"
      )
      private Parent parent;
      

      附:我知道它在老化 3 年后就死了 :)

      【讨论】:

      • StackOverflow 不是论坛,欢迎新的答案 :)
      • 并运行“PRAGMA foreign_keys=ON;”打开数据库以启用外键时。
      • 当然。另一个僵尸帖子的爱好者(比如我自己):)
      猜你喜欢
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2019-09-25
      • 2021-12-10
      • 1970-01-01
      • 2015-12-23
      • 2017-06-13
      相关资源
      最近更新 更多