2017-02-21 125 views
0

我需要根據搜索關鍵字從CoreData中搜索和獲取對象。 我的核心數據對象包含一個名爲names的字符串屬性。我的要求如下:使用確切的子字符串篩選字符串

managedObject1.names = "James,James Willson,Willson James,James Camaroon" 
managedObject2.names = "James Willson,James,Willson James,James Camaroon" 
managedObject3.names = "James Camaroon,James Willson,Willson James,James" 
managedObject4.names = "James Willson,Willson James,James Camaroon" 

當用戶使用'James'搜索關鍵字時,我只需要managedObject1,managedObject2和managedObject3。我試過NSPredicate(format: "names contains[d] %@", name),但它也返回了managedObject4。

如何爲此編寫謂詞?

+0

是啊!因爲它也有'詹姆斯'作爲子串。謂詞總是返回該對象。那麼爲什麼你不需要對象4. –

+0

你應該可能得到所有的託管對象,並使用快捷的'filter'方法。它更靈活,速度更快。 – Sweeper

+1

@Sweeper:在獲取請求中通過NSPredicate進行篩選是在SQlite級別完成的,並且具有隻將匹配對象加載到內存中的優勢。 –

回答

2

您可以使用謂詞與 匹配用逗號包圍的名正則表達式模式:

let name = "James" 
let pattern = "(.*,)?\(NSRegularExpression.escapedPattern(for: name))(,.*)?" 
let predicate = NSPredicate(format: "name MATCHES %@", pattern) 

(更好的模式將有一個「名稱」實體一對多的關係,而不是包含逗號分隔名稱的單個字符串。)

+0

我+1模型的變化。之後搜索/過濾應該會更好,更容易。 – Larme

0

因此,如果我正確理解您的要求,那麼您只想返回那些沒有任何名字或姓氏的名稱爲James的對象?

在這種情況下,你可以有這樣的

let names = "James Willson,Willson James,James Camaroon" 
let searchedString = "James" 
let searchedStringCount = searchedString.characters.count 

let endIndex = names.index(names.startIndex, offsetBy: searchedStringCount + 1) 
let startIndex = names.index(names.endIndex, offsetBy: -(searchedStringCount + 1)) 

let startString = names.substring(to: endIndex) // prints "James " 
let endString = names.substring(from: startIndex) // prints "maroon" 

let shouldBeReturned = startString == "\(searchedString)," || endString == ",\(searchedString)" || names.contains(",\(searchedString),") // prints false 

這樣的條件的情況考慮到一個事實,即名稱可以是在開始(在它的前面沒有昏迷)或結尾(後面沒有逗號)