我有过滤器对象。它有几个属性和关系。如果没有人具有相同的属性和关系,我想创建新的过滤器对象。如何做到这一点?
问问题
2128 次
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 以查找任何现有的过滤器对象。如果没有找到,您可以处理创建一个新的过滤器:
这是一个辅助函数
+(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 回答