executeFetchRequest 使 NSPredicate 的应用崩溃,NSString 对象位于 CONTAINS 的左侧

executeFetchRequest crashes app for NSPredicate with NSString object on left side of CONTAINS

我正在尝试从核心数据中获取对象,其 'name' 属性包含一个特定的 NSString sPersonName。下面的代码就是这样做的

NSString *sPersonName = @"Some Value";
NSFetchRequest<Entity*>* request = [Entity fetchRequest];
[request setPredicate:[NSPredicate predicateWithFormat:@"name CONTAINS[c] %@", sPersonName]];
NSError *error;
NSArray *arrResults = [self.persistentContainer.viewContext executeFetchRequest:request error:&error];

这段代码执行得很好,我得到了预期的结果。

但是如果我没有从上层请求中得到任何结果,我会尝试从 Core Data 中获取对象,这样 sPersonName 字符串包含 'name' 属性的值 保存的对象。 下面是代码。

request = [Entity fetchRequest];
[request setPredicate:[NSPredicate predicateWithFormat:@"%@ CONTAINS[c] name", sPersonName]];
arrResults = [self.persistentContainer.viewContext executeFetchRequest:request error:&error];

此命令失败 并使应用程序崩溃并产生以下错误

-[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x170a43750
2017-01-24 23:02:28.124224 TestApp[2934:845977] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x170a43750'

任何人都可以指导我我做错了什么吗? 非常感谢。

编辑 screenshot of predicate

所以,经过几天的反复试验,我找到了解决方案。 NSPredicate 期望诸如 NSArray 之类的数据结构对象位于 CONTAINS 的左侧。传递一个 NSString 对象会破坏它。

因此,解决方案是将 NSString 转换为 NSArray。下面的代码运行正常。

NSArray *arrName = [sPersonName componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ CONTAINS[c] name", arrName];


[request setPredicate:predicate];
arrResults = [self.m_persistentContainer.viewContext executeFetchRequest:request error:&error];