核心数据和 NSPredicate

Posted

技术标签:

【中文标题】核心数据和 NSPredicate【英文标题】:Core Data and NSPredicate 【发布时间】:2014-07-13 17:12:16 【问题描述】:

我正在寻找一种使用 NSPredicate 设置“beginswith [cp]”条件来获取对象的方法。在数据模型中有一个包含 4 个基本属性的实体。第一个属性的名称是 cityName。目标是查找 cityName 以给定字符开头的记录,但我不确定如何格式化谓词。 这是我的代码的一部分

NSString * lastCharacter = [userCity substringFromIndex:[userCity length] -1];
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context =
[appDelegate managedObjectContext];

NSEntityDescription *entityDesc =
[NSEntityDescription entityForName:@"Cities"
            inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(cityName = beginswith [cp] %@ )", lastCharacter];
[request setPredicate:pred];

但对于此代码,我收到以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "(cityName = beginswith [cp] %@ )"'

【问题讨论】:

在我看来问题出在 lastCharacter 的值上。 【参考方案1】:

问题在于beginswith 是一个运算符,所以= beginswith 是一个太多了。谓词中的括号也不是必需的。因此:

[NSPredicate predicateWithFormat:@"cityName beginswith[cd] %@", lastCharacter];

【讨论】:

我的代码的第一部分是正确的。要获取字符串的最后一个字符,必须使用 [string substringFromIndex:[string length] -1]。对于第二部分,您的回答帮助我解决了我的问题。【参考方案2】:

只需像这样更改您的谓词:-

   NSPredicate *pred = [NSPredicate predicateWithFormat:@"cityName contains[cd] %@",lastCharacter];

【讨论】:

以上是关于核心数据和 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

核心数据和图像缓存

核心数据 NSFetchedResultsController 和排序

核心数据和分页

NSDictionary 和核心数据

大数据三大核心技术:拿数据、算数据、卖数据!

同时添加核心数据输入和segue