2011-08-10 118 views
4

对我来说,我似乎很疯狂,我的应用程序中的所有NSFetchRequests都分布在不同的视图控制器中,是否有一个好的数据访问模式,可以将我需要的数据放在一个地方?核心数据数据访问模式?

+0

你不能只是这些视图控制器的内容绑定到一个单独的控制器处理所有的提取请求的,他们缓存如果可能? –

回答

5

我同意这有点多,幸运的是Core Data有Active Record。这使得获取不那么单调乏味,例如,取出由核心数据的所有Person对象会是这么简单

NSArray *people = [Person findAll]; 
+0

我们已经在实时应用中使用它。它大大简化了我们的核心数据代码。 –

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]; 
} 

然后使用方法一样,如果它在你的代码的任何其它类。写一次,无处不在。

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