2017-02-21 19 views
0

検索キーに基づいてCoreDataからオブジェクトを検索して取得する必要があります。 私のコアデータオブジェクトにはnamesという文字列プロパティが含まれています。ユーザーは、私が欲しい "ジェームスのみmanagedObject1、managedObject2とmanagedObject3で鍵を検索するときのようには正確な部分文字列を使用したフィルタ文字列

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" 

を次のように私の要件があります。

NSPredicate(format: "names contains[d] %@", name)を試しましたが、managedObject4も返されました。

このための述語を書くには?

+0

うん!それは部分文字列として 'James'を持っているからです。述語は常にそのオブジェクトを返します。なぜオブジェクト4は必要ないのですか? –

+0

おそらくすべての管理対象オブジェクトを取得し、swiftの '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 

のような条件を持つことができ、その場合には

それ後のカンマなし)

関連する問題