2011-05-27 60 views
0

我正面臨FMDatabase的嚴重問題。我使用如下FMDatabase是否存在「NOT IN」問題或者iPhone上的SQLite不支持它?

SELECT * FROM `article` WHERE `alias` NOT IN ('example_alias') 

查詢我使用「NOT IN」,因爲不是「example_alias」有可能是我要排除別名列表。但奇怪的是,這個查詢的結果包含了我想排除的別名的所有記錄。所以FMDatbase正在選擇錯誤的記錄。如果我複製&將此查詢粘貼到SQLite數據庫瀏覽器並在那裏執行,查詢就完成了。
如果我在'IN'前面刪除'NOT',那麼SQLite數據庫瀏覽器會顯示給定別名的所有記錄,並且正如所料,FMDatabase會給我所有沒有它們的記錄...
在下一步I想用DELETE替換SELECT,但是如果保留了所有不需要的記錄並且我想保留的記錄被刪除,確實會造成傷害。
這是FMDatabase或底層SQLite框架(我正在使用libsqlite3.dylib)的一個已知錯誤還是我做錯了什麼?

+0

SQLite絕對正確處理NOT IN,我無法相信FMDB會發生如此嚴重的錯誤。你可以給文章的DDL語句,以及內容的DML語句嗎? – 2011-05-27 08:30:48

+0

經過數小時的嘗試和錯誤,我終於找到了我的錯誤。比誤解機制如何運作更沒有錯誤。我用了一個「?」在我的查詢中使別名列表更加動態。我通過附加字符串逗號分隔和修剪最後一個逗號來構建這個列表。最後,字符串看起來像「'alias1','alias2','alias3'」。該字符串被插入「?」。但是取代「?」的機制其分配的內容包括一些轉義特徵,這些特徵將我的值字符串列表作爲單個值處理,因此沒有這個大的別名字符串的記錄被返回。 – TRD 2011-05-27 12:19:32

回答

0

在FoxPro子查詢需要指定爲另一個SQL SELECT語句.. SELECT * FROM article WHERE alias NOT IN(選擇 'example_alias' *) 難道這是解決方案?

+0

你的提示並不是我的問題的答案,但給了我一個有用的提示,我可以指導我的嘗試。在你的回答中,我嘗試用另一種方式在「NOT IN」括號中插入列表,而不是用通常的「?」。這導致了預期的結果。 – TRD 2011-05-27 12:27:50

+0

好的,你能告訴我你結束的代碼嗎,我很想學習!謝謝 – Raymondo 2011-05-27 12:42:14

+0

1. NSString * aliasList = [NSString stringWithString:@「」]; 2.(在for循環中)aliasList = [aliasList stringByAppendingFormat:@「'%@',」,@「next_alias」]; 3. aliasList = [aliasList stringByReplacingCharactersInRange:NSMakeRange([aliasList length] - 1,1)withString:@「」];我們可以通過下面的例子來說明這個問題:[db executeUpdate:[NSString stringWithFormat:@「DELETE FROM'article' WHERE'type' =?AND''menualias' NOT IN(%@)」,aliasList],[NSNumber numberWithInt:TYPE_ARTICLE]]; – TRD 2011-05-27 13:15:17