如何在NSPredicate中使用NSDate和NSString从Core Data中获取数据?

时间:2015-01-15 11:09:50

标签: ios objective-c core-data nsdate nspredicate

我在iPhone应用程序中从Core数据库中获取数据时遇到问题。

我正在使用此代码(第1行)这是正常工作,这里我从日期中获取数据:

注意: date的数据类型为NSDateselectedDate的类型也为NSDate

第1行:

[NSPredicate predicateWithFormat:@"date == %@",selectedDate];

此代码(第2行)也正常工作当我提取系统数据时:

第2行:

[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"systemName == '%@'",selectedSystemString]];

但是当我将上述两个谓词与此代码(第3行)结合使用时:

第3行:

 [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(date == %@) AND (systemName == '%@')",selectedDate,selectedSystemString]];

应用程序在第3行上崩溃,并在控制台中显示此错误消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "(date == 2015-01-15 18:30:00 +0000) AND (systemName == 'A')"'

*** First throw call stack:
(0x26494c1f 0x33c9cc8b 0x270feb55 0x270fc9bd 0x270fc93d 0x9b263 0x9c143 0xa8815 0x29a69f97 0x29b1bc0f 0x299cdc4d 0x29949aab 0x2645b3b5 0x26458a73 0x26458e7b 0x263a7211 0x263a7023 0x2d75a0a9 0x299b31d1 0xb1e7d 0x3421caaf)
libc++abi.dylib: terminating with uncaught exception of type NSException

2 个答案:

答案 0 :(得分:3)

尝试使用复合谓词,

NSPredicate *datePredicate = [NSPredicate predicateWithFormat:@"date == %@",selectedDate];
NSPredicate *stringPredicate = [NSPredicate predicateWithFormat:@"systemName == %@",selectedSystemString];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates: @[datePredicate, stringPredicate]];

使用andPredicateWithSubpredicates:方法的复合谓词类似于AND谓词,使用AND的解决方案

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date == %@ AND systemName == %@",selectedDate, selectedSystemString];

答案 1 :(得分:3)

前两行之间的差异是第三行失败的原因。 (第二个也不正确,但因为你正在使用字符串而起作用。)

如果您熟悉SQL,就像使用查询参数一样。

在第1行你说,这是我正在寻找的这个参数(恰好是一个日期)。

在第2行你说,这就是我要找的东西。没有参数。 应该是这样的:

[NSPredicate predicateWithFormat:@"systemName == %@",selectedSystemString];

第3行失败,因为您将日期转换为字符串(使用description上的NSDate方法);你的谓词没有参数。看起来应该更像这样:

[NSPredicate predicateWithFormat:@"(date == %@) AND (systemName == %@)",selectedDate,selectedSystemString];