查找或创建唯一的核心数据实体

epo*_*gee 13 core-data unique objective-c insert-update

核心数据驱动应用程序的常见方案是从后备存储中获取唯一对象.如果存在具有特定唯一属性的对象,则返回该对象,如果它不返回新创建的对象.我发现自己一遍又一遍地写同样的东西,所以我用一种方便的方法把它包起来.但这似乎是微不足道的,我在这里重新发明轮子吗?有没有更简单,开箱即用的方法来实现这一目标?

干杯,
EP

+(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;
}
Run Code Online (Sandbox Code Playgroud)

我使用这样的方法:

SomeEntity *entity = [CDUtils uniqueEntityfForName:@"SomeEntity" withValue:@"foo" forKey:@"bar" inManagedObjectContext:context];
Run Code Online (Sandbox Code Playgroud)

rge*_*rge 3

相当标准。我的核心数据实体有很多方法,例如[aStudent enrollmentForId:(long long)idValue createIfMissing:YES].

我还想插入mogenerator,它可以消除 Core Data 的很多痛苦。除此之外,它还为数据模型中定义的每个获取请求生成一个工厂方法。因此,在模型中创建一个获取谓词,例如,

事情: thingyId == $forThingyId

产生一个匹配的类方法:

+(NSArray *)fetchThingies:(NSManagedObjectContext *)moc forThingyId:(id)thingyId
Run Code Online (Sandbox Code Playgroud)

...它完成了你在那里写的前半部分。像这样的包装

-(Thingy*)thingyForIdValue:(long long)thingyId
Run Code Online (Sandbox Code Playgroud)

那么编写起来就很简单了,无论在什么类中保存你的托管对象上下文(例如“父”实体,或应用程序委托,或其他什么)。