1

述語を使用して Core Data ストアから結果をフェッチする際に問題が発生しています。私のアプリケーションが行うことは、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;

'more than' 述語のコードは正常に機能し、> 1970 (年) などのクエリのデータ セットを返します。< 1970 などの「未満」述語を使用してフィルター処理しようとすると、Core Data データセット全体 (フィルター処理されていない) が返されます。

[[activeValue 値] 値] は NSNumber です。

私は一生それを理解することはできません-述語はまったく同じですが、1文字が異なります!

助けていただければ幸いです。さらにコード/情報が必要な場合はお知らせください。

編集: 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 が列挙型の数値であるなど) が必要であることを明示的に示す述語を作成しても、まだ機能しません。それは本当に奇妙です。

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 に答える