Как получить сохраненную ссылку на подкласс NSManagedObject?

У меня есть подкласс NSManagedObject с именем Tour. Я сохранил ссылку на него, используя этот код:

    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. Инициализация« struct NSManagedObject * », ожидается« struct Tour * »

Кроме того, при выполнении это дает мне следующее: Завершение приложения из-за необработанного исключения «NSObjectInaccessibleException», причина: «CoreData не может выполнить ошибку для» 0x5001eb0

Как я могу это решить?


person Davide    schedule 16.03.2010    source источник
comment
Вы можете пропустить шаг NSData: [userDefaults setURL:url forKey:kActiveLibrary] - - - NSURL *url = [userDefaults URLForKey:kActiveLibrary]; - - - и я должен поддержать голосование за [self.managedObjectContext objectWithID:oid]   -  person bshirley    schedule 12.07.2011


Ответы (3)


Что касается предупреждения, вы пытались принудительно привести тип?

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

Проблема, связанная с NSObjectInaccessibleException, решена в ссылке, опубликованной St3fan :)

PS: Помните, что подкласс nsmanagedobject по-прежнему является nsmanagedobject!

person unixo    schedule 27.04.2010
comment
Вау, я был действительно новичком, когда задал этот вопрос!!! : D Спасибо за ваш ответ, извините, что не принял его раньше. - person Davide; 04.10.2012
comment
Потрясающий ..!! Это действительно здорово, когда не такие новички, как я, натыкаются на подобные сообщения .. и это действительно помогает .. !! +1 @unixo. - person Shailesh; 23.07.2013

Это отличная статья о хранении и извлечении ссылок на объекты.

http://cocoawithlove.com/2008/08/safely-fetching-nsmanagedobject-by-uri.html

person Stefan Arentz    schedule 16.03.2010
comment
Да, я следил за этим. Но речь идет о nsmanagedobject. Я хотел бы знать, как работать с подклассами nsmanagedobject. Почему он говорит, что они несовместимые типы? - person Davide; 16.03.2010

Похоже, что ваш URI не зарегистрирован в контексте.

Из документов:

Если объект не зарегистрирован в контексте, он может быть извлечен или возвращен как ошибка. Этот метод всегда возвращает объект. Предполагается, что данные в постоянном хранилище, представленном objectID, существуют — если это не так, возвращаемый объект выдает исключение при доступе к любому свойству (то есть при возникновении ошибки). Преимущество такого поведения заключается в том, что оно позволяет создавать и использовать ошибки, а затем создавать базовые строки позже или в отдельном контексте.

objectRegisteredForID: вернет nil, если вы хотите изящно выйти из этого условия

person bshirley    schedule 12.07.2011