2010-03-16 48 views
2

我有一個名爲Tour的NSManagedObject子類。我使用此代碼存儲對它的引用:如何檢索存儲的NSManagedObject子類的引用?

prefs = [NSUserDefaults standardUserDefaults]; 
NSURL *myURL = [[myTour objectID] URIRepresentation]; 
NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:myURL]; 
[prefs setObject:uriData forKey:@"tour"]; 

現在我想檢索它。我試着使用:

NSData *myData = [prefs objectForKey:@"tour"]; 
    NSURL *myURL = [NSKeyedUnarchiver unarchiveObjectWithData:myData]; 

    TourAppDelegate *appDelegate = (TourAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSManagedObjectID *myID = [appDelegate.persistentStoreCoordinator managedObjectIDForURIRepresentation:myURL]; 

    if (myID) 
    { 
    Tour *tempObject = [appDelegate.managedObjectContext objectWithID:myID]; //WARNING 
    tour = tempObject; 
    } 

    if (tour) //instruction... 

但它給我這個警告「不兼容的Objective-C類型的初始化‘結構NSManagedObject *’,預期‘結構之旅*’

另外,在執行的時候,它給我這個:終止應用程序由於未捕獲的異常「NSObjectInaccessibleException」,理由是:「CoreData不能滿足對故障」 0x5001eb0

我怎樣才能解決這個

+0

可以跳過'NSData'步:'[userDefaults setURL:URL forKey:kActiveLibrary]' - - - 'NSURL * URL = [userDefaults URLForKey:kActiveLibrary];' - - - 我必須爲'[self.managedObjectContext objectWithID:oid]投票第二個' – bshirley 2011-07-12 19:45:19

回答

3

關於警告,你試圖迫使類型轉換?

Tour *tempObject = (Tour *) [appDelegate.managedObjectContext objectWithID:myID]; 

相關NSObjectInaccessibleException問題是解決了在鏈接St3fan發佈:)

PS:請記住,nsmanagedobject的一個子類仍然是一個nsmanagedobject!

+0

哇,當我問這個問題時,我真的是新手! :D 謝謝你的回答,對不起,我以前不接受。 – Davide 2012-10-04 05:34:02

+0

沒問題,快樂如果幫助:) – unixo 2012-10-19 10:15:25

+0

真棒..! 當像我這樣的「不那麼新鮮」的人遇到像這樣的帖子時,它確實感覺很棒。 +1 @unixo。 – Shailesh 2013-07-23 11:56:08

0

看起來像您擁有的URI未在上下文中註冊。

從文檔:

如果對象沒有在上下文中登記,可以是取出或返回故障。這個方法總是返回一個對象。假設objectID表示的持久性存儲中的數據存在 - 如果不存在,則當您訪問任何屬性(即,觸發故障時)時,返回的對象將引發異常。這種行爲的好處是,它允許您創建和使用錯誤,然後稍後或在單獨的上下文中創建基礎行。

objectRegisteredForID:將返回nil,如果你想優雅地從這種情況中失敗