对我来说,我的所有这些NSFetchRequests都在我的应用程序中的不同视图控制器中展开,这似乎很疯狂,是否有一个很好的数据访问模式,可以将我需要的东西放在一个地方?
答案 0 :(得分:5)
我同意它有点多,幸运的是核心数据有Active Record。这使得获取不那么繁琐,例如,从核心数据中提取所有Person对象就像
一样简单NSArray *people = [Person findAll];
答案 1 :(得分:1)
是的,它被称为 facade pattern 。只需在NSManagedObject
子类上定义一个公共方法,如下所示:
@interface Group : NSManagedObject { }
// … cruft here …
-(NSArray*)peopleSortedByName;
@end
隐藏讨厌的实现,如下:
-(NSArray*)peopleSortedByName;
{
NSFetchRequest* request = // … bla bla, lots of code here
return [[self managedObjectContext] executeFetchRequest:request
error:NULL];
}
然后使用该方法,就像它是代码中的任何其他类一样。写一次,到处都是浮雕。
答案 2 :(得分:0)
为NSManagedObject上下文定义一个类别方法,它将一般查询打包成一行。
@interface NSManagedObjectContext(MyQueryAdditions)
-(NSArray *)queryEntityForName:(NSString *)name predicateFormat:(NSString *)pstring argumentArray:(NSArray *)arr;
@end
@implementation NSManagedObjectContext(MyQueryAdditions)
-(NSArray *)queryEntityForName:(NSString *)name predicateFormat:(NSString *)pstring argumentArray:(NSArray *)arr
{
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:self];
NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
[fetch setEntity:entity];
NSPredicate *pred;
if(pstring)
{
if(arr) pred = [NSPredicate predicateWithFormat:pstring argumentArray:arr];
else pred = [NSPredicate predicateWithFormat:pstring];
[fetch setPredicate:pred];
}
NSError *error = nil;
[self retain];
[self lock];
NSArray *results = [self executeFetchRequest:fetch error:&error];
if (error) {
NSLog(@"MOC Fetch - Unresolved error %@, %@", error, [error userInfo]);
results = [NSArray array];
}
[self unlock];
[self release];
return results;
}
@end
表示基本的所有项目查询可以像
一样简单NSArray *cres = [managedObjectContext queryEntityForName:@"Person" predicateFormat:nil argumentArray:nil];