ページ

2010年6月3日木曜日

CoreData - Object ID(その3)Object ID から NSManagedObject を取得する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Object ID の URI から NSMangedObject を取得することができる。ステップは2つ。

(1) -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:] を使い、NSManagedObjectID を取得する
(2) -[NSManagedObjectContext objectWithID:] に(1)の結果を渡し、NSManagedObject を取得する。

NSPersistentStoreCoordinator Class Reference - managedObjectIDForURIRepresentation:

NSManagedObjectContext Class Reference - objectWithID:

やてみよう。

サンプル:CoreDataObjectID at 2010-06-03 from xcatsan's SampleCode - GitHub


前回までのサンプルに次の2つの修正を加える。
1. アプリ終了時に選択していたレコードの Object ID (URI) を User Defaults へ保存する

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {

NSArray* selectedObjects = [arrayController selectedObjects];
if ([selectedObjects count] > 0) {
Book* book = [selectedObjects objectAtIndex:0];
NSManagedObjectID* moid = [book objectID];
NSString* uriString = [[moid URIRepresentation] description];
[[NSUserDefaults standardUserDefaults]
setValue:uriString forKey:@"PREVIOUS_URI"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
2. アプリ起動時に User Defaults に保存された Object ID (URI) から、NSManagedObject を取得し、ログへ書き出す。



- (void)awakeFromNib
{
[arrayController setManagedObjectContext:self.managedObjectContext];
NSString* uriString = [[NSUserDefaults standardUserDefaults] objectForKey:@"PREVIOUS_URI"];
if (uriString) {
NSURL* uri = [NSURL URLWithString:uriString];
NSManagedObjectID* objectID =
[self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
Book* book = (Book*)[self.managedObjectContext objectWithID:objectID];
NSLog(@"book: %@, %@ (%@)", book.Title, book.Author, uriString);
}
}



実行してみよう。まず行を選択し、アプリを終了する。
続いてアプリを起動し、ログを確認する。

CoreDataObjectID[12239:80f] book: Book2, Inu (x-coredata://677CA547-4D80-417A-8810-70847FB0375D/Book/p2)

出た。

- - - -
一連の検証で Object ID がアプリの状態保持と復帰(レジューム)に利用できそうなことがわかった。