2

我有一个名为 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的错误

我该如何解决这个问题?

4

3 回答 3

3

关于警告,您是否尝试强制类型转换?

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

与 NSObjectInaccessibleException 相关的问题已在 St3fan 发布的链接中解决:)

PS:请记住,nsmanagedobject 的子类仍然是 nsmanagedobject!

于 2010-04-27T10:36:08.583 回答
1

这是一篇关于存储和检索对象引用的精彩文章。

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

于 2010-03-16T13:29:37.640 回答
0

看起来您拥有的 URI 未在上下文中注册。

从文档:

如果对象没有在上下文中注册,它可能会被获取或作为错误返回。此方法始终返回一个对象。假定 objectID 表示的持久存储中的数据存在 - 如果不存在,则在您访问任何属性时(即触发故障时),返回的对象将引发异常。这种行为的好处是它允许您创建和使用故障,然后在以后或在单独的上下文中创建基础行。

objectRegisteredForID:nil如果您想从这种情况下优雅地失败,将返回

于 2011-07-12T19:47:37.437 回答