【发布时间】:2012-10-05 05:39:04
【问题描述】:
我在使用谓词从 Core Data 存储中获取结果时遇到问题。我的应用程序所做的是根据一个或多个谓词从存储中获取结果,并向您显示基于所有谓词的结果或基于每个谓词的结果。
它在大多数情况下都可以正常工作,除了我无法让“小于”查询工作。这是我正在使用的代码:
case CriteriaSelectionIsLessThan:
pred = [NSPredicate predicateWithFormat:@"ANY value.attribute.name == %@ AND ANY value.%@ < %@", [attribute name], keyPath, [[activeValue value] value]];
break;
case CriteriaSelectionIsMoreThan:
pred = [NSPredicate predicateWithFormat:@"ANY value.attribute.name == %@ AND ANY value.%@ > %@", [attribute name], keyPath, [[activeValue value] value]];
break;
“超过”谓词的代码工作正常,它返回查询的数据集,例如 > 1970(一年)。当我尝试使用“小于”谓词(例如
[[activeValue value] value] 是一个 NSNumber。
我这辈子都想不通 - 谓词完全相同,但有一个字符不同!
我们将不胜感激。如果您需要更多代码/信息,请告诉我。
编辑:这是我在从 JSON 导入时映射数据类型的方式:
[attrib setDataType:[NSNumber numberWithInteger:[[attribute valueForKey:@"type"] integerValue]]];...
// Set the correct data type of the value
switch ([[attrib dataType] integerValue]) {
case AttributeDataTypeNumber:
[value setNumberValue:[NSNumber numberWithInteger:[valueForKey integerValue]]];
break;
case AttributeDataTypeString:
[value setStringValue:(NSString *)valueForKey];
break;
case AttributeDataTypeDate: {
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"dd-MM-YYYY"];
[value setDateValue:[df dateFromString:(NSString *)valueForKey]];
}
break;
case AttributeDataTypeBool:
[value setBooleanValue:[NSNumber numberWithBool:[valueForKey boolValue]]];
break;
}
看,我的 JSON 中的数据类型保证是正确的,因为我在导入它之前检查它(而不是在应用程序中)。即使我构建了一个明确表示我想要某个数据类型的谓词(例如 value.attribute.dataType == 1 ,其中 1 是枚举中的数字),它仍然不起作用。真的很奇怪。
【问题讨论】:
-
不确定这是否会有所帮助,但是否有可能将整个 keypath,而不仅仅是 value 后面的内容,放入单个表达式(将评估为 value.RESTOFKEYPATH),然后使用 @ 987654323@ 作为格式说明符,检查起来会很有趣,但不太可能。无论如何,这是第一件让我感到震惊的事情。甚至像
[NSPredicate predicateWithFormat:@"ANY value.attribute.name == %@ AND ANY %K > %@", [attribute name], [NSString stringWithFormat:@"value.%@",keyPath], [[activeValue value] value]] -
不幸的是也不起作用!我尝试创建一个没有任何动态变量的谓词(即显式键入表达式),但它仍然不起作用。适用于超过,但不低于。我已经检查过数据是否可以正常导入到 Core Data 中 - 可以。我只是无法确定这里的问题是什么:(
-
很奇怪!当您在调试器中打印谓词的描述时,您会看到什么?此外,当使用您知道它应该为假的对象的特定实例进行评估时,它是否评估为 YES - 即它是否发生在获取请求上下文之外?并且您对值名称部分也进行了硬编码,结果相同?我的另一个奇怪的想法是将它们分成两个谓词,一个用于命名一个用于比较,然后重建一个复合“和”谓词。没有合乎逻辑的理由应该起作用,所以请随意忽略该建议:)
标签: objective-c ios nspredicate predicate