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 ...)
但它不接受。它表示需要 LIMIT
、WHERE
或其他术语,而不是 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}
);
分配给变量 rows
的 delete()
的 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)
我正在尝试删除 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 ...)
但它不接受。它表示需要 LIMIT
、WHERE
或其他术语,而不是 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}
);
分配给变量 rows
的 delete()
的 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)