gpt4 book ai didi

java - SQLiteDatabase删除涉及子查询

转载 作者:行者123 更新时间:2023-11-30 11:43:09 25 4
gpt4 key购买 nike

我将 SQLiteDatabase 用于 Java 库,我需要支持一个非常低版本的 Android API (v4),它没有附带支持外键的 SQLite 版本。

因此,为了删除顶级数据及其所有“子项”,我需要先删除这些子项,以便手动重现与外键约束相同的效果 ON DELETE CASCADE

我想做的是使用删除 api 的以下 SQL。

DELETE FROM childTable 
WHERE someFK IN (
SELECT parent_id
FROM parentTable
WHERE someFlag = 1
)

我想出的最初解决方案是在我的 where 子句中对选择查询进行硬编码,如下所示,但是由于 SQLiteDatabase api 支持查询、execSQL 等,我使用的这个解决方案是不是非常错误并且使用起来很危险?解决方法:

String[] whereArgs = {Integer.toString(1)};
this.database.delete(TABLE_CHILD_ONE, COL_ONE_FK_SESSION+" IN (SELECT "+COL_SESSION_ID+" FROM "+TABLE_SESSIONS+" WHERE "+COL_SESSION_DONE+"=?)", whereArgs);
this.database.delete(TABLE_CHILD_TWO, COL_TWO_FK_SESSION+" IN (SELECT "+COL_SESSION_ID+" FROM "+TABLE_SESSIONS+" WHERE "+COL_SESSION_DONE+"=?)", whereArgs);
this.database.delete(TABLE_CHILD_THREE, COL_THREE_FK_SESSION+" IN (SELECT "+COL_SESSION_ID+" FROM "+TABLE_SESSIONS+" WHERE "+COL_SESSION_DONE+"=?)", whereArgs);

最佳答案

您可以为每个表创建触发器:

CREATE TRIGGER delete_cascade AFTER DELETE ON parentTable
BEGIN
DELETE FROM childTable child WHERE child.parent_id=OLD.id;
END;

在事务中运行它。

More about triggers

关于java - SQLiteDatabase删除涉及子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11415064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com