核心数据数据访问模式?

Posted

技术标签:

【中文标题】核心数据数据访问模式?【英文标题】:Core Data data access pattern? 【发布时间】:2011-08-10 17:54:20 【问题描述】:

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

【问题讨论】:

难道你不能将这些视图控制器的内容绑定到一个单独的控制器来处理所有的获取请求,并尽可能缓存它们吗? 【参考方案1】:

我同意这有点多,幸运的是 Core Data 有 Active Record。这使得获取变得不那么繁琐,例如,从核心数据中获取所有 Person 对象就像

NSArray *people = [Person findAll];

【讨论】:

我们已经在实时应用中使用它。它极大地简化了我们的 Core Data 代码。【参考方案2】:

是的,它被称为 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];

然后像使用代码中的任何其他类一样使用该方法。一次写,处处解脱。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于核心数据数据访问模式?的主要内容,如果未能解决你的问题,请参考以下文章

访问者模式

在 MVVM 应用程序中访问核心数据堆栈

设计模式之访问者模式

Hibernate——数据访问层的架构模式<转>

Spring数据访问和事务

设计模式之访问者模式