NSPredicate工作超过,但不低于

时间:2012-10-05 05:39:05

标签: objective-c ios nspredicate predicate

我在使用谓词从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是枚举中的数字),它仍然不起作用。这真的很棒。

2 个答案:

答案 0 :(得分:1)

你确定它会返回WHOLE数据集吗?我猜你为lessThan操作获得的值是value.%@

的NULL值的对象

编辑:

以下是我如何动态处理模型的属性:

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关键字时,我认为这是返回我不想要的值的罪魁祸首。现在就像一个魅力。