Java SQLite删除查询在moveToFirst()上冻结
我试图在Android应用程序中删除SQLite数据库中的行 以下是查询和调用它的Java代码: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
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)