如何在android中使用ormlite在外键上执行级联删除

Man*_*wal 5 database orm android ormlite android-sqlite

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

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

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

代码:
父表:

@DatabaseField(id = true)
private Integer id;

@ForeignCollectionField(eager = false)
private ForeignCollection<Child> childCollection;
Run Code Online (Sandbox Code Playgroud)

子表:

@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;
Run Code Online (Sandbox Code Playgroud)

现在如果我删除特定id的父行,那么这不会从子表中删除子项.

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

    } catch (SQLException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

请指导我,我做错了.我曾多次尝试和谷歌,但没有运气.

Mig*_*eal 3

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

parent.getChildren().clear();
Dao<Parent, Integer> parentDao = databaseHelper.getParentDao();
parentDao.delete(parent);
Run Code Online (Sandbox Code Playgroud)

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

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

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