125

次のコードを使用して、CoreDataでオブジェクトの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];

ただし、独自のフェッチ要求を開始しない方法で実行したいと思います。何か案は?

4

3 に答える 3

211

あなたが欲しい:

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
                                   error:(NSError **)error

そのIDを持つストアからオブジェクトをフェッチします。存在しない場合はnilを取得します。

(注意:NSManagedObjectContextには、似たような名前の2つのメソッドがあり、私をつまずかせました。それらをまっすぐに保つために、他の2つのメソッドは次のようになります。

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID

...そのようなオブジェクトが実際にストアに存在するかどうかに関係なく、提供されたobjectIDを使用して障害オブジェクトを作成します。それが存在しない場合、最初にNSManagedObjectContextを使用してオブジェクトを挿入しない限り、障害を発生させるものはすべて失敗しますinsertObject:。これについて私が見つけた唯一の用途は、ObjectIDを保持しながら、ストアからストアにオブジェクトをコピーすることです。

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID

...このmanagedObjectContextによってストアからフェッチされた場合、そのIDを持つオブジェクトを返します。この方法が何に役立つかを誰かが知っているなら、コメントしてください。)

[eta .:最初の方法と他の2つの方法のもう一つの重要な違いはexistingObjectWithID:error:、障害を返さないことです。常にオブジェクト全体をフェッチします。これを回避しようとしている場合(たとえば、大きなblobプロパティを持つ、フェッチするのに費用のかかるオブジェクトを操作する場合)、objectWithID:またはobjectRegisteredForID:を巧みに使用する必要があります。これは、障害を発生させません。または、適切に構成されたフェッチ要求を使用してください。]

于 2011-02-17T22:11:48.553 に答える
5

objectWithID:はあなたが探している方法であり、これを行うための推奨される方法です。objectWithID:NSManagedObjectContextを効率的に使用して、必要な数のレベルでのみオブジェクトをプルします。これを行う他の手段とは異なります。objectWithID:バッキングストレージに移動する前に、親コンテキスト、永続ストアコーディネーター、および永続ストア自体のメモリ内情報を正しく使用します。

これについては、WWDC2012セッション「コアデータのベストプラクティス」で詳しく説明されています。

于 2014-08-07T01:20:29.633 に答える
3

Swift 5バージョン:

https://developer.apple.com/documentation/coredata/nsmanagedobjectcontext/1506686-existingobject

object(with:)メソッドまたは。もありますregisteredObject(for:)。必要なものに応じて。

于 2019-07-06T10:13:16.483 に答える