Coredata通过其属性和关系比较了两个NSManageBjects



我有过滤对象。它具有几个属性和关系。如果没有一个具有相同属性&的人,我想创建新的过滤对象。关系。如何实现这一目标?

我会选择一种更通用的方法。我将使用该对象的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];
}

您必须手动搜索Coredata以寻找任何现有的过滤对象。如果找不到,您可以处理创建新的过滤器:

这是一个辅助功能

+(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];

您可能必须定义自己的谓词。

最新更新