2013-10-02 85 views
1

我有以下代碼:NSPredicate轉義反斜槓字符

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like[c] %@", projectName]; 
[fetchRequest setPredicate:predicate]; 
[moc executeFetchRequest:request error:error]; // moc & error are defined elsewhere 

當我與項目名是運行這段代碼「ASDF」一切都很正常。然而,當此值被設置爲「ASDF \」(注意在端反斜槓),下面的異常被呈現:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The backslash is a wildcard char, and cannot appear unescaped at the end of a string.' 

PO請求爲我提供了以下信息:

po request 
<NSFetchRequest: 0x101348ee0> (entity: Project; predicate: (name LIKE[c] "asdf\\"); sortDescriptors: ((null)); type: NSManagedObjectResultType;) 

對我而言,這似乎是一個簡單的問題,但無法在互聯網上找到解決方案,誰知道呢?

+1

但是「asdf /」在最後有斜線,而不是反斜線。 –

+2

你真的需要「LIKE」嗎?和*通配符?否則,您可以使用「CONTAINS」。 –

+0

謝謝馬丁!它不必處理?和*通配符,所以我將謂詞改爲'name == [c]%@',現在它完美地工作! –

回答

2

LIKE在謂詞處理*?作爲通配符, 其中?匹配1個字符和*匹配0或多個字符。這些通配符 字符可以是轉義作爲\*\?以匹配星號或問號逐字。

因此,反斜槓本身必須在「LIKE」查詢 中跳轉爲\\以匹配單個反斜槓。 A 單個反斜槓在搜索模式結尾 會導致錯誤(這就是您的情況發生的情況)。

如果您不需要通配符處理,則可以使用==BEGINSWITHCONTAINS代替。 所有這些都可以與[c]相結合。