2011-08-10 53 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];