我在使用谓词从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;
'more than'谓词的代码工作正常,它返回查询的数据集,例如&gt; 1970年(一年)。当我尝试使用'小于'谓词来过滤它时,例如&lt; 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中的数据类型保证是正确的,因为我在导入它之前检查它(不在应用程序中)。即使我构建一个明确表示我想要某个dataType的谓词(例如value.attribute.dataType == 1,其中1是枚举中的数字),它仍然不起作用。这真的很棒。
答案 0 :(得分:1)
你确定它会返回WHOLE数据集吗?我猜你为lessThan操作获得的值是value.%@
编辑:
以下是我如何动态处理模型的属性:
for (NSEntityDescription *entity in [self.managedObjectModel entities]) // self.managedObjectModel is a NSManagedObjectModel
{
for (NSAttributeDescription *attribute in [[entity attributesByName] allValues])
{
NSString *key = [attribute name];
// do something with key
switch ([attribute attributeType])
{
case NSBooleanAttributeType:
case NSInteger16AttributeType:
case NSInteger32AttributeType:
case NSInteger64AttributeType:
case NSDecimalAttributeType:
case NSDoubleAttributeType:
case NSFloatAttributeType:
// do something with numeric types
break;
case NSStringAttributeType:
// do something with string types
break;
case NSDateAttributeType:
// do something with date types
break;
}
}
}
每个case
处理谓词的方式不同。您可以缓存密钥:键入性能关系。
答案 1 :(得分:0)
我明白了!如果有其他人遇到这个问题,这就是我修复它的方法:
[NSPredicate predicateWithFormat:@"SUBQUERY(value, $val, $val.attribute.name == %@ && $val.%@ < %@).@count > 0", [attribute name], keyPath, [[activeValue value] value]]
我认为这是因为它是一个必须在多个标准上匹配的多对键。当我使用ANY关键字时,我认为这是返回我不想要的值的罪魁祸首。现在就像一个魅力。