2011-08-26 131 views
20

我一直在掙扎了幾個小時試圖調試爲什麼下面的刪除查詢居然沒有刪除任何東西,即使完全相同的數據庫上完全相同的查詢在Firefox」 SQLite的經理工作得很好:爲什麼刪除rawQuery需要moveToFirst才能真正刪除行?

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); 

由於對於JOIN和子查詢有點複雜,我的想法圍繞着Android的關於子查詢的sqlite實現中的一些限制,所以我試圖簡化查詢。但它仍然沒有刪除任何東西。

然後,我把它改成一個選擇查詢(只是替換SELECT * DELETE)和工作。所以可能這不是連接或子查詢畢竟是罪魁禍首。

爲了測試選擇查詢我又增加了一個moveToFirst()返回的光標:

mDb.rawQuery(deleteSql, null).moveToFirst(); 

當我後來又變回刪除查詢,我忘了刪除moveToFirst(),然後成功了!

真的很高興,現在的工作,但我很困惑,爲什麼有必要來移動光標,以實際刪除任何東西。這是設計還是錯誤?

+0

我剛剛殺了4小時對這個愚蠢的一個**的問題,他們應該有這樣的文件中明確提出,時間真是浪費。 – LuckyMe

+0

我喜歡你的問題如何包含我的刪除問題的答案,非常有效! – Noumenon

+0

感謝您的發現。這應該一定要記錄!我認爲不應該是這樣,但至少現在起作用。 – kgrevehagen

回答

10

我不能回答爲什麼,但另一種解決方案是使用.execSQL(字符串)張貼here

5

甲rawQuery返回結果集,這僅僅是對查詢結果的參考的光標。你應該直接使用直接delete()調用。看看文檔:

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

或SQLiteStatement:

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

+0

如果可能,我會使用直接刪除查詢,但它不支持這樣複雜的sql語句。至少據我所知,它不能在連接和子查詢上操作。 – marlar

+0

然後使用我建議的第二個選項。 – SBerg413

+0

我當然會看看這個選項,但我仍然很好奇爲什麼需要moveToFirst。我見過很多使用rawQuery執行刪除查詢的例子,而且他們都沒有使用moveToFirst。 – marlar

4

在我的情況下,也同樣的事情已經發生了DELETE,它調用後成功運行「cursor.moveToFirst()」。 INSERT和UPDATE查詢也是如此。我也觀察到,爲上述查詢調用光標上的任何方法,我都得到了正確的結果。在不調用任何遊標的方法的情況下,正在發生所需的效果。所以,我認爲你的問題的答案是:只有當我們調用光標上的某個方法時纔會執行查詢。

3

答案,就是因爲rawQuery實際上並不執行直到ü呼籲恢復光標一些方法。 moveToFirst,isAfterLast ..

+0

與舊的答案有什麼不同?你剛剛複製了@mopurizwarriors單詞。 – Androiderson

+0

請再次仔細閱讀...這不是關於成功或不成功。它根本不運行,但在執行遊標上的某些方法之前準備查詢。此外,這並不是嘗試/失敗的方法來確定答案,但表示它的意思是這樣工作。 – Ewoks

+1

然後,你應該詳細說明你的答案,因爲**只有當我們調用光標**上的一些方法時,纔會執行查詢**並且** rawQuery實際上不會執行,直到調用返回的遊標上的某個方法**讀取同一個傢伙。任何人都會說你剛剛複製,因爲你的答案是2歲。 – Androiderson