2013-12-21 56 views
0

我正在努力與CoreData。我想取下列對象:NSManagedObject錯誤/無法獲取由NSManagedObject處理的'原始'對象

@interface Email : NSManagedObject { 
} 

@property (nonatomic, copy) NSString *email; 
@property (nonatomic, copy) NSString *contact; 
@end 

..和把結果的NSMutableArray裏面,但NSString的內容(不NSManagedObjects!)。這是因爲我使用了json-framework,並且該引擎不允許NSManagedObjects被傳遞。

這些線取perfom從CoreData

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Emails" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"email"]]; 
    NSError *error = nil; 
    NSMutableArray *fetchedObjects = [[NSMutableArray alloc] init]; 
    fetchedObjects= [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

    flight.emails=fetchedObjects; 

抓取的 '飛行' 對象被聲明如下:

@interface Flight : NSObject { 
    NSMutableArray     *_emails; 
} 

@property (nonatomic, retain) NSMutableArray *emails; 

有了這個代碼,我得到CoreData故障。我嘗試了一些其他的實現變體,但從未真正設法在flight.emails中使用NSString對象,但始終使用NSManagedObjects。我所嘗試的是在Email NSManagedObject中實現一個專用的getter函數,該函數複製提取的NSString並返回副本。

我知道這是一種常見問題,但是,我的研究並沒有導致這方面的解決方案。

謝謝, 彼得

回答

1

從經驗來看,只有setPropertiesToFetch:請求返回的對象是字典時的作品。因此,您的代碼中有幾個問題:

  1. 您正在詢問特定屬性(電子郵件),但尚未將返回類型設置爲字典。看看setResultType:
  2. 你仍然需要得到結果並從中提取電子郵件對象。您不能只將結果數組分配給您的電子郵件屬性。

試試這個:

[fetchedRequest setResultType:NSDictionaryResultType]; 
NSArray* results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

if(error != nil || results == nil) return; 

flight.emails = [results valueForKeyPath:@"email"]; 
+0

備註:檢查是否有差錯情況應該總是通過檢查返回值來實現(在這種情況下:'如果(結果==無)...')和而不是通過檢查'error'變量。 (記錄在這裏:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError.html#//apple_ref/doc/uid/TP40001806-CH204-SW1。) –

+0

@MartinR有道理,謝謝。 –

+0

非常感謝,利奧納丹,你的答案擊中了它。 –

相關問題