我需要根据搜索关键字从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 :(得分:2)
您可以使用具有正则表达式模式的谓词 匹配逗号括起的名称:
let name = "James"
let pattern = "(.*,)?\(NSRegularExpression.escapedPattern(for: name))(,.*)?"
let predicate = NSPredicate(format: "name MATCHES %@", pattern)
(更好的模式是与" Name"实体建立多对多关系,而不是包含以逗号分隔的名称的单个字符串。)
答案 1 :(得分: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
这样的条件考虑到名称可以在开头(在它前面没有昏迷)或在结尾(在它之后没有逗号)的事实