核心数据驱动应用程序的常见方案是从后备存储中获取唯一对象。如果存在具有特定唯一属性的对象,则返回该对象,如果它不返回新创建的对象。我发现自己一遍又一遍地写同样的东西,所以我用一种方便的方法把它包起来。但这似乎是微不足道的,我在这里重新发明轮子吗?是否有更简单,开箱即用的方法来实现这一目标?
干杯,
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;
}
我使用这样的方法:
SomeEntity *entity = [CDUtils uniqueEntityfForName:@"SomeEntity" withValue:@"foo" forKey:@"bar" inManagedObjectContext:context];
答案 0 :(得分:3)
非常标准。我的核心数据实体有很多方法,如[aStudent enrollmentForId:(long long)idValue createIfMissing:YES]
。
我还想插入mogenerator,这可以消除Core Data的痛苦。除此之外,它还为数据模型中定义的每个获取请求生成工厂方法。因此,在模型中创建一个获取谓词,例如
thingies:
thingyId == $forThingyId
产生匹配的类方法:
+(NSArray *)fetchThingies:(NSManagedObjectContext *)moc forThingyId:(id)thingyId
...这就是你在那里写的东西的上半部分。像
这样的包装器-(Thingy*)thingyForIdValue:(long long)thingyId
然后,可以轻松地编写,无论什么类保存您的managedObjectContext(例如,“父”实体,或app委托,或其他什么。)