我有一个名为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类型。初始化'struct NSManagedObject *',预期'struct Tour *'
另外,在执行时,它给了我这个:由于未捕获的异常'NSObjectInaccessibleException'而终止应用程序,原因:'CoreData无法解决'0x5001eb0
的错误我该如何解决这个问题?
答案 0 :(得分:3)
关于警告,您是否尝试强制进行类型转换?
Tour *tempObject = (Tour *) [appDelegate.managedObjectContext objectWithID:myID];
与NSObjectInaccessibleException相关的问题在链接St3fan上解决了:)
PS:请记住,nsmanagedobject的子类仍然是一个nsmanagedobject!
答案 1 :(得分:1)
这是一篇关于存储和检索对象引用的好文章。
http://cocoawithlove.com/2008/08/safely-fetching-nsmanagedobject-by-uri.html
答案 2 :(得分:0)
看起来您所拥有的URI未在上下文中注册。
来自文档:
如果您希望从此条件中优雅地失败,如果对象未在上下文中注册,则可以将其作为故障提取或返回。此方法始终返回一个对象。假定objectID表示的持久性存储中的数据存在 - 如果不存在,则在访问任何属性时(即,触发错误时),返回的对象将引发异常。这种行为的好处是它允许您创建和使用错误,然后在以后或在单独的上下文中创建基础行。
objectRegisteredForID:
将返回nil