java - SQLite DELETE 查询在 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,
我以为查询可能太慢了,但是半个小时后,它仍然卡在这里。
我试图用 替换DELETE
,SELECT
它也冻结了。
SELECT
我单独尝试了内部查询,它们运行良好。
我试图SELECT
用(1,2,3)和(4,5,6)替换内部查询,它有效。
我尝试使用JOIN
而不是,IN (SELECT ...)
但它不接受它。它说LIMIT
,WHERE
或者其他条款是预期的,而不是JOIN
。
我不知道如何进一步调查。有任何想法吗?
解决方案
不要rawQuery()
用于删除行。
该方法rawQuery()
用于以 a 的形式返回带有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}
);
delete()
分配给变量的返回值rows
包含已删除的行数。
推荐阅读
- spring-boot - 在 Spring Boot 中,如何注册解析应用程序配置时可用的自定义转换器?
- javascript - 以对象形式传递参数的构造函数,如何构建构造函数属性?
- python - 如何解释 pytz.timezone 的内容
- docker-compose - 运行组合时出错。YAML linter 没有显示错误
- javascript - 使用按钮在 Javascript 中进行事件处理
- r - 在控制台和 RStudio 查看器之间更改频率表的显示
- tfs - TFS WIQL 曾经包含标签语法吗?
- go - 创建路由模块 Go/Echo RestAPI
- .net - ZedGraph 关于 YAxis 和 XAxis
- python - 如何将 RotatingFileHandler 与根记录器一起使用