次のコードを使用すると、Core Data でオブジェクトの ID を簡単に取得できます。
NSManagedObjectID *moID = [managedObject objectID];
しかし、特定のオブジェクト ID を指定して、コア データ ストアからオブジェクトを取得する方法はありますか? 次のように、NSFetchRequest を使用してこれを行うことができることはわかっています。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID];
[fetchRequest setPredicate:predicate];
ただし、独自のフェッチ要求を開始しない方法で実行したいと思います。何かアイデアはありますか?
ベストアンサー1
あなたが望むこと:
-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
error:(NSError **)error
その ID を持つオブジェクトをストアから取得します。存在しない場合は nil になります。
(注意: NSManagedObjectContext には似たような名前のメソッドが 2 つあり、混乱してしまいました。区別しやすいように、他の 2 つのメソッドの機能を以下に示します。
-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID
...指定されたオブジェクトIDを持つ障害オブジェクトを作成します。かどうかそのようなオブジェクトは実際にストアに存在します。存在しない場合は、最初に NSManagedObjectContext の でオブジェクトを挿入しない限り、フォールトを発生させるすべての操作は失敗しますinsertObject:
。私が見つけた唯一の用途は、ObjectID を保持しながらストアからストアにオブジェクトをコピーすることです。
-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID
...そのIDを持つオブジェクトを返します。もしこの managedObjectContext によってストアから取得されました。このメソッドが何に役立つか知っている方がいらっしゃいましたら、コメントしてください。
[追記: 最初のメソッドと他の 2 つのメソッドのもう 1 つの重要な違いは、 がexistingObjectWithID:error:
エラーを返さないことです。常にオブジェクト全体をフェッチします。これを回避しようとする場合 (たとえば、大きな blob プロパティを持つ、フェッチにコストのかかるオブジェクトを扱う場合)、エラーを発生させないobjectWithID:
またはを巧みに使用するobjectRegisteredForID:
か、適切に構成されたフェッチ要求を使用する必要があります。]