2010-03-16 3 views
2

У меня есть подкласс NSManagedObject под названием Tour. Я сохранил ссылку на него, используя этот код:Как получить сохраненную ссылку на подкласс 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 *', как ожидается 'структура Tour *

Plus, при выполнении, это дает мне это : Нагрузочное приложение из-за неперехваченное исключение «NSObjectInaccessibleException», причина: «CoreData не может выполнить вину за» 0x5001eb0

Как я могу решить эту проблему

+0

Вы можете пропустить 'NSData' шаг:' [userDefaults setURL: URL forKey: kActiveLibrary] '- - -' NSURL * URL = [userDefaults URLForKey: kActiveLibrary]; '- - - и я должен повторить голосование за' [self.managedObjectContext objectWithID: oid] ' – bshirley

ответ

3

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

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

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

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

+0

Вау, я действительно был новичком, когда задавал этот вопрос !!! : D Спасибо за ваш ответ, извините, что я этого не принимал раньше. – Davide

+0

без проблем, счастливый если помог все равно :) – unixo

+0

Awesome .. !! Это действительно здорово, когда «не такие новички», как я, встречаются с такими сообщениями .. и это действительно помогает .. !! +1 @unixo. – Shailesh

1

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

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

+0

Да, я последовал за этим. Но речь идет о nsmanagedobject. Я хотел бы знать, как обращаться с подклассами nsmanagedobject. Почему он говорит, что они несовместимые типы? – Davide

0

Похоже на то, что URI у вас нет регистраций в контексте.

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

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

objectRegisteredForID: вернется nil, если вы хотите, чтобы грациозно неудачу из этого состояния