2012-04-12 156 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