2012-04-12 157 views
0

编辑:对于我认为我不应该创建这种类型的实例方法,而是使其成为类方法!另一件事,我添加了获取方法到C类,它的工作。我只是想,如果可以通过托管对象访问数据存储区,这会很方便,但我认为这有些违背managedObjectContext背后的想法,持久性等等。核心数据:从类别中取数据(核心类的扩展名)


我不知道如果我正在尝试做一些你不应该做的事,但在这里。

我有一个实体A与实体B(B到许多A)有关系的数据模型。我在数据存储中有许多类型为B的实体,现在我想创建一些类型为A的实体。为了这样做,我需要获得对B类实体的引用,即,我有查询数据存储。我作为一个B类如下,即:现在

#import "B+Helper.h" 

@dynamic managedObjectContext; 

@implementation B (Helper) 

- (Store *)getBByRef:(NSString *)ref 
{ 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"B" inManagedObjectContext:self.managedObjectContext]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDescription]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"ref == %@", ref]; 
    [request setPredicate:predicate]; 

    NSError *error = nil; 
    NSArray *storeArray = [self.managedObjectContext executeFetchRequest:request error:&error]; 
    NSInteger bCount = [bArray count]; 
    if (bCount > 1 || bCount == 0) { 
     // Deal with error... 
    } else { 
     return [bArray objectAtIndex:0]; 
    } 
} 

,问题是,我似乎无法正确设置managedObjectContext ---我得到的错误:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'B' 

我试过路过在调用上述方法之前,从AppDelegate到C类的managedObjectContext必须获取B实体,并从C类到B + Helper类,但这并不奏效。

基本上,我只是希望能够从简单的NSObject类或NSManagedObject扩展,即从不是某种类的UIViewController的类中进行核心日期查询。

在C类我做了如下:

B *b = [[B alloc] init]; 
b.managedObjectContext = self.managedObjectContext; 

但后来我得到一个错误说,选择是不存在:

setManagedObjectContext:]: unrecognized selector sent to instance... 

我希望这是有道理的?

回答

0

真的,不要用实例方法创建一个类别,而应该将已经写好的方法添加到生成的B实体类实现和接口中。

+ (Store *)getBByRef:(NSString *)ref; 

它应该可以正常工作。

+0

类别实际上非常适合与Core Data一起使用,因为如果您必须重新生成类文件,您的方法将不会被清除。你的想法虽然不错,但我只是将该类方法放在类别中。 – sosborn 2012-04-13 00:10:16

+0

从再生的角度来看,分类很棒 – 2012-04-13 00:19:25