3

私はフィルターオブジェクトを持っています。いくつかの属性と関係があります。同じ属性と関係を持つ人がいない場合は、新しいフィルター オブジェクトを作成したいと考えています。これを達成する方法は?

4

2 に答える 2

1

私はより一般的なアプローチを選択します..オブジェクトの NSEntityDescriptions を取得し、その説明内のすべてのプロパティを使用して述語を作成します。

以下のようなので..

- (void)insertIfUnique:(NSManagedObject*)obj inContext:(NSManagedObjectContext*)ctx {

NSMutableString *format = [NSMutableString string];

NSEntityDescription *desc = obj.entity;
NSArray *attrs = desc.attributeKeys;

for(NSString *attr in attrs) {
    if(format.length)
        [format appendString:@" AND "];
    [format appendFormat:@"%@==%@", attr, [obj valueForKey:attr]];
}

NSPredicate *p = [NSPredicate predicateWithFormat:format];
NSFetchRequest *f = [[NSFetchRequest alloc] initWithEntityName:desc.name];
f.predicate = p;
if([ctx countForFetchRequest:f error:nil]==0)
    [ctx insertObject:obj];

}
于 2012-11-14T09:55:03.973 に答える
0

CoreData で既存のフィルター オブジェクトを手動で検索する必要があります。見つからない場合は、処理して新しいフィルターを作成できます。

ここに1つのヘルパー関数があります

+(id)uniqueEntityfForName:(NSString *)name 
                withValue:(id)value 
                   forKey:(NSString *)key
   inManagedObjectContext:(NSManagedObjectContext *)context {

    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];    
    request.entity = [NSEntityDescription entityForName:name inManagedObjectContext:context];
    request.predicate = [NSPredicate predicateWithFormat:[key stringByAppendingString:@" == %@"], value];
    NSArray *result = [context executeFetchRequest:request error:nil];

    id entity = [result lastObject];
    if (entity == nil) {
        entity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];
        [entity setValue:value forKey:key];
    } else {
        entity = [result lastObject];
    }

    return entity;
}

私はこの方法を次のように使用します。

SomeEntity *entity = [CDUtils uniqueEntityfForName:@"SomeEntity" withValue:@"foo" forKey:@"bar" inManagedObjectContext:context];

独自の述語を定義する必要がある場合があります。

于 2012-11-09T09:07:13.680 に答える