Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite删除查询在moveToFirst()上冻结_Java_Android_Sqlite_Android Sqlite - Fatal编程技术网

Java SQLite删除查询在moveToFirst()上冻结

Java SQLite删除查询在moveToFirst()上冻结,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,我试图在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=?)&quo

我试图在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上冻结

以下是解释查询计划:

我以为查询可能太慢了,但半个小时后,它仍然在这里阻塞

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

我单独尝试了内部SELECT查询,它们工作得非常好

我试着用1,2,3和4,5,6替换内部SELECT查询,结果很好

我尝试使用联接而不是选择。。。但它不接受。它说的是限制,其中或其他条款是预期的,而不是加入

我不知道如何进一步调查。有什么想法吗?

不要使用rawQuery删除行。 rawQuery方法用于以游标的形式返回带有SELECT语句的行

使用:


分配给变量rows的delete的返回值包含已删除的行数。

我终于让它使用WHERE子句:


DELETE不返回结果集。使用execSQL,而不是rawQuery。它也会被execSQL卡住。为什么Android文档会说执行一条SQL语句,而不是SELECT/INSERT/UPDATE/DELETE。对于execSQL?因为删除行的建议方法是delete。当您使用其他客户端发出查询时,它是否也会冻结?那么db可能是。我这样做是因为复杂的where子句。我认为它更容易阅读。它还保留着delete。你有表中语句的语言索引吗?没有。你正在查询表中语句两次。创建索引:在senetencelanguage上创建索引idx_lang;然后再试一次。
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, 
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}
);
version<>?
AND EXISTS (SELECT 1 FROM sentence WHERE language=? AND sentence=_id)
AND EXISTS (SELECT 1 FROM sentence WHERE language=? AND translation=_id)