Как получить сохраненную ссылку на подкласс NSManagedObject? - PullRequest
2 голосов
/ 16 марта 2010

У меня есть подкласс 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

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

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

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

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

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

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

1 голос
/ 16 марта 2010

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

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

0 голосов
/ 12 июля 2011

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

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

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

* +1007 *

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

...