1

我在使用谓词从核心数据存储中获取结果时遇到问题。我的应用程序所做的是根据一个或多个谓词从存储中获取结果,并向您显示基于所有谓词的结果或基于每个谓词的结果。

它在大多数情况下都可以正常工作,除了我无法让“小于”查询工作。这是我正在使用的代码:

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(一年)。当我尝试使用“小于”谓词(例如 < 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 是枚举中的数字),它仍然不起作用。这真的很奇怪。

4

2 回答 2

1

你确定它会返回整个数据集吗?我猜测您为 lessThan 操作获得的值是具有 NULL 值的对象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处理谓词的方式不同。您可以缓存 key:type 关系以提高性能。

于 2012-10-05T07:40:33.063 回答
0

我想到了!如果其他人遇到了这个问题,我是这样解决的:

[NSPredicate predicateWithFormat:@"SUBQUERY(value, $val, $val.attribute.name == %@ && $val.%@ < %@).@count > 0", [attribute name], keyPath, [[activeValue value] value]]

我认为这是因为它是一对多键,必须在多个标准上匹配。当我使用 ANY 关键字时,我认为这是返回我不想要的值的罪魁祸首。现在就像一个魅力。

于 2012-10-10T22:31:44.683 回答