核心数据数据访问模式?

时间:2011-08-10 17:54:20

标签: iphone ipad core-data

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

3 个答案:

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