如何在 NSPredicate 中使用 NSDate 和 NSString 从核心数据中获取数据?
How to use NSDate and NSString in a NSPredicate to fetch data from Core Data?
我在 iPhone 应用程序中从核心数据数据库获取数据时遇到问题。
我正在使用这段代码 (第 1 行),它工作正常,在这里我从一个日期获取数据:
注:date
的数据类型是NSDate
,selectedDate
也是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
尝试使用复合谓词,
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];
前两行的区别在于第三行失败的原因。 (第二个也不正确,但可以使用,因为您使用的是字符串。)
如果您熟悉 SQL,这就像使用查询参数一样。
在第 1 行中,您说的是我要使用此参数(恰好是日期)查找的内容。
您在第 2 行中说,这就是我要查找的内容。没有参数。 应该是这样的:
[NSPredicate predicateWithFormat:@"systemName == %@",selectedSystemString];
第 3 行失败,因为您将日期转换为字符串(使用 NSDate
上的 description
方法);您的谓词没有参数。它应该看起来更像这样:
[NSPredicate predicateWithFormat:@"(date == %@) AND (systemName == %@)",selectedDate,selectedSystemString];
我在 iPhone 应用程序中从核心数据数据库获取数据时遇到问题。
我正在使用这段代码 (第 1 行),它工作正常,在这里我从一个日期获取数据:
注:date
的数据类型是NSDate
,selectedDate
也是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
尝试使用复合谓词,
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];
前两行的区别在于第三行失败的原因。 (第二个也不正确,但可以使用,因为您使用的是字符串。)
如果您熟悉 SQL,这就像使用查询参数一样。
在第 1 行中,您说的是我要使用此参数(恰好是日期)查找的内容。
您在第 2 行中说,这就是我要查找的内容。没有参数。 应该是这样的:
[NSPredicate predicateWithFormat:@"systemName == %@",selectedSystemString];
第 3 行失败,因为您将日期转换为字符串(使用 NSDate
上的 description
方法);您的谓词没有参数。它应该看起来更像这样:
[NSPredicate predicateWithFormat:@"(date == %@) AND (systemName == %@)",selectedDate,selectedSystemString];