Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用精确子字符串过滤字符串_Ios_Swift_Core Data_Nspredicate - Fatal编程技术网

Ios 使用精确子字符串过滤字符串

Ios 使用精确子字符串过滤字符串,ios,swift,core-data,nspredicate,Ios,Swift,Core Data,Nspredicate,我需要根据搜索键从CoreData中搜索和获取对象。 我的核心数据对象包含一个名为names的字符串属性。我的要求如下 managedObject1.names = "James,James Willson,Willson James,James Camaroon" managedObject2.names = "James Willson,James,Willson James,James Camaroon" managedObject3.names = "James Camaroon,Jam

我需要根据搜索键从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

我尝试了NSPredicateformat:names包含[d]@,但它也返回managedObject4


如何为此编写谓词?

您可以使用带有正则表达式模式的谓词 匹配由逗号括起的名称:

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

更好的模型是与名称实体具有对多关系,而不是包含逗号分隔名称的单个字符串。

因此,如果我正确理解您的要求,您希望只返回那些名称为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

这样的条件考虑到这样一个事实,即名称可以在开头,前面没有逗号,或者在结尾,后面没有逗号

是的!因为它也有詹姆斯作为子串。谓词总是返回那个对象。那么为什么不需要对象4呢?您可能应该获取所有托管对象,并使用swift筛选方法。它更灵活、更快。@Sweeper:在获取请求中通过NSPredicate进行过滤是在SQlite级别上完成的,其优点是只将匹配的对象加载到内存中。I+1模型更改。之后搜索/过滤应该更好、更容易。