SQLite DELETE 查询在 moveToFirst() 上冻结

SQLite DELETE query freezes on moveToFirst()

我正在尝试删除 Android 应用程序中 SQLite 数据库中的行。

这是查询和调用它的 Java 代码:

final Cursor cursor = mDb.rawQuery("DELETE FROM link WHERE version!=? AND sentence IN (SELECT _id FROM sentence WHERE language=?) AND translation IN (SELECT _id FROM sentence WHERE language=?)", new String[]{String.valueOf(versionToConserve), sentenceLanguage, translationLanguage});
cursor.moveToFirst();
cursor.close();

应用程序在 cursor.moveToFirst() 时冻结。

这里是 EXPLAIN QUERY PLAN:

selectid:0, order:0, from:0, detail:SEARCH TABLE link USING INDEX sqlite_autoindex_link_1 (sentence=? AND translation=?),
selectid:0, order:0, from:0, detail:EXECUTE LIST SUBQUERY 0,
selectid:0, order:0, from:0, detail:SCAN TABLE sentence,
selectid:0, order:0, from:0, detail:EXECUTE LIST SUBQUERY 1,
selectid:1, order:0, from:0, detail:SCAN TABLE sentence, 

我以为可能是查询太慢了,结果半小时后,还是卡在这里

我尝试用SELECT替换DELETE,它也冻结了。

我单独尝试了内部 SELECT 查询,它们运行良好。

我尝试用 (1,2,3) 和 (4,5,6) 替换内部 SELECT 查询,它有效。

我尝试使用 JOIN 而不是 IN (SELECT ...) 但它不接受。它表示需要 LIMITWHERE 或其他术语,而不是 JOIN

我不知道如何调查更多。有什么想法吗?

不要使用 rawQuery() 删除行。
方法 rawQuery() 用于 return 带有 SELECT 语句的行,形式为 Cursor.

使用delete():

String strWhere = "version <> ? AND " +
                  "sentence IN (SELECT _id FROM sentence WHERE language = ?) AND " +
                  "translation IN (SELECT _id FROM sentence WHERE language = ?)";
int rows = mDB.delete(
    "link", 
    strWhere, 
    new String[]{String.valueOf(versionToConserve), sentenceLanguage, translationLanguage}
);

分配给变量 rowsdelete() 的 returned 值包含已删除的行数。

我终于让它与这个 WHERE 子句一起工作:

version<>?
AND EXISTS (SELECT 1 FROM sentence WHERE language=? AND sentence=_id)
AND EXISTS (SELECT 1 FROM sentence WHERE language=? AND translation=_id)