为什么删除rawQuery需要moveToFirst才能实际删除行?

mar*_*lar 23 sqlite android

我一直在努力调试为什么以下删除查询实际上没有删除任何内容,即使完全相同的数据库上的完全相同的查询在Firefox的SQLite管理器中工作正常...

String deleteSql = "DELETE FROM showsummary WHERE url IN (SELECT url FROM showsummary JOIN article_categories USING (url) WHERE categoryid=20 AND title LIKE 'page=%')";
mDb.rawQuery(deleteSql, null);
Run Code Online (Sandbox Code Playgroud)

由于JOIN和子查询都有点复杂,我的想法围绕Android的sqlite实现中关于子查询的一些限制,所以我尝试简化查询.但它仍然没有删除任何东西.

然后我将其更改为选择查询(刚刚用SELECT*替换DELETE)并且这样做有效.所以可能不是连接或子查询毕竟是罪魁祸首.

为了测试select查询,我moveToFirst()在返回的游标中添加了一个:

mDb.rawQuery(deleteSql, null).moveToFirst();
Run Code Online (Sandbox Code Playgroud)

当我后来再次将其更改回删除查询时,我忘记删除 moveToFirst() 它然后它工作了!

它现在很好用,但我很困惑为什么有必要移动光标以实际删除任何东西.这是设计还是错误?

Mob*_*ius 12

我不能回答原因,但另一种解决方案是使用.execSQL(String)发布在这里


SBe*_*413 5

rawQuery返回结果集的Cursor,它只是对查询结果的引用.你应该只是使用直接的delete()调用.看看文档:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

或SQLiteStatement:

http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html