2010-01-06 76 views
8

我有一種情況,我想通過用戶名鍵從核心數據存儲中獲取對象,但我希望比較是不區分大小寫的。謂詞我是這樣的:對數組中的字符串不區分大小寫NSPredicate?

username IN $usernames 

我那麼做了變量替換是我想找的用戶名字符串數組。它可以工作,但區分大小寫。我想這樣做,我想:

username IN[c] $usernames 

不幸的是,似乎不工作。字符串比較必須仍然以區分大小寫的方式進行。 (我不知道它是一個不支持的查詢錯誤。)

有沒有不同的方式來寫這個謂詞,所以它的工作方式,我需要或我只是失去了一些明顯的東西?

+0

您是通過謂詞構建器還是直接在代碼中構建謂詞? – Anurag 2010-01-06 23:36:36

+0

這是一個存儲在數據模型中的提取請求。 – Sean 2010-01-07 01:37:09

回答

9

在對SQLite存儲執行提取操作時,顯然會忽略IN運算符上的大小寫修飾符。 (您從您的問題中省略了商店類型。)

我建議根據文檔提交一個錯誤,以便可以記錄此限制/行爲。

我還建議在bug報告中提交一個功能請求,這樣可以考慮將來的支持。

與此同時,您必須將您的獲取請求從數據模型中拉出並以編程方式構建。您可以構建一個複合謂詞或謂詞,對每個值進行不區分大小寫的平等匹配(並測試它是否滿足您的性能需求。)

請注意,如果您在10.6之前支持OS修飾符==不被支持,在這種情況下,還需要另一種替代解決方案。

+0

爲了您的最後一點,您是否將==用作謂詞字符串?以編程方式構建謂詞時它仍然工作嗎?我瞄準了10.5。 – Sean 2010-01-07 17:47:15

+1

在10.5上進行測試後,它看起來不起作用。該死!看來我唯一的選擇就是建立一個如下的表達式:「username CONTAINS [cd] $ u and $ u CONTAINS [cd] username」。嘆。 – Sean 2010-01-07 19:31:46

+0

而且沒有。即使使用兩個CONTAINS也行不通,因爲我的整體表達式是一堆其他謂詞的OR,並且看起來我不能有一個包含AND謂詞的OR集。等等。經過這一切都錯了,我切換到使用LIKE [cd]和逃避*和?來自我輸入字符串的字符。奇蹟般有效。似乎有一個相當令人痛苦的數量的謂詞處理的限制... – Sean 2010-01-07 20:32:10

1

您可能會嘗試類似ANY $usernames LIKE[c] username。我做了類似的事情,其中​​代替變量替換,我只是有一個關鍵路徑,如「persons.name」,並且謂詞適用於我。不知道它是否與其中的變量有什麼不同,而不是關鍵路徑,但值得一試。

+0

不幸的是,該謂詞不能用於SQLite存儲。 (未實現的SQL生成。)在它工作的情況下,注意確保字符串sin $ usernames具有文字LIKE通配符轉義。 – 2010-01-07 04:24:31

1

這是另一種解決方法,但需要您更改MOM。

使用戶名成爲一個完整的實體。創建用戶名和其他實體之間的反向關係。

現在的讀取請求時,設置實體爲「用戶名」,然後運行這個謂詞(假設一個「名字」屬性「家長」的屬性):

[NSPredicate predicateWithFormat:"(name like[c] %@) && (parent == %@)", theUserName, theParentObject] 

這可能是矯枉過正,但將允許您可以根據需要運行搜索。

-1

雖然這個問題是幾年前我只是在同樣的問題,迷迷糊糊地解決了這個問題是這樣的:

NSArray *values = @[@"FOO", @"bar" ,@"lorem"]; 
NSString *predicate; 

predicate = @"value LIKE[cd] '"; 
predicate = [predicate stringByAppendingString: 
      [values componentsJoinedByString: 
       @"' OR value LIKE[cd] '"]]; 
predicate = [predicate stringByAppendingString:@"'"]; 

NSLog(@"%@", predicate); 
// Output: 
// value LIKE[cd] 'FOO' OR value LIKE[cd] 'bar' OR value LIKE[cd] 'lorem' 

這個創建值列表中靜態謂詞表達式。也許這對某人有用。

更新2:

其實它看起來像下面的更新的解決方案不使用SQLite工作,併產生

'NSInvalidArgumentException', 
reason: 'unimplemented SQL generation for predicate : ... (bad LHS)' 

我覺得對於數組/詞典/套comparisions和IN有隻允許鍵在操作員的左側。

UPDATE:

的表達式和我找到了另外的形式給出了一些研究之後,似乎工作得很好:

NSPredicate *predicate = 
    [NSPredicate predicateWithFormat: 
    @"lowercase(value) IN %@", values]; 

此使用函數表達式lowercase:得到的小寫字母表示值。剩下要做的就是確保values的所有條目都是小寫字母,並且您可以使用不區分大小寫的IN表達式。

相關問題