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

Regarding the warning, did you try to force type casting?

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

The problem related to NSObjectInaccessibleException is solved in the link St3fan posted :)

PS: Remember that a subclass of nsmanagedobject is still a 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 に答える