executeFetchRequest使用CONTAINS左侧的NSString对象崩溃NSPredicate的应用程序

时间:2017-01-25 04:17:14

标签: objective-c core-data nspredicate nsfetchrequest

我正在尝试从Core Data中获取对象,其'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字符串CONTAINS已保存对象的'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

1 个答案:

答案 0 :(得分:0)

因此,经过几天的反复试验,我找到了解决方案。 NSPredicate 期望数据结构对象(例如 NSArray )位于CONTAINS的左侧。传递 NSString 对象会破坏它。

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

paste