web-dev-qa-db-ja.com

特定のオブジェクトIDからコアデータオブジェクトを取得する方法は?

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

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

117
Jason

あなたが欲しい:

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

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

NS

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

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

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

...そのIDを持つオブジェクトを返しますifこのmanagedObjectContextによってストアからフェッチされました。このメソッドが何に役立つかを知っている人はコメントしてください。)

[eta .:最初のメソッドと他の2つのメソッドのもう1つの重要な違いは、existingObjectWithID:error:がフォールトを返さないことです。常にオブジェクト全体を取得します。それを回避しようとしている場合(たとえば、大きなblobプロパティを持つ取得コストの高いオブジェクトを操作する場合)、フォールトを発生させないobjectWithID:またはobjectRegisteredForID:を賢く使用する必要があります。 ;または、適切に設定された取得リクエストを使用します。]

203
rgeorge

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

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

4
quellish

Swift 5バージョン:

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

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

0