1. ホーム
  2. ios

[解決済み] 特定のObject IDからCore Dataオブジェクトを取得するには?

2022-07-29 15:20:26

質問

以下のコードで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];

しかし、私はそれ自身のフェッチ要求を開始しない方法でそれをしたいです。何かアイデアはありますか?

どのように解決するのですか?

あなたがしたい。

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

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

(注意: NSManagedObjectContextには、似たような名前のメソッドが2つあり、私を混乱させました。それらを整理するために、他の2つのメソッドが何をするのかを説明します。

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

...は与えられた objectID を持つ fault オブジェクトを作成します。 であろうとなかろうと そのようなオブジェクトが実際にストアに存在するかどうかに関わらず。存在しない場合、NSManagedObjectContextの insertObject: . 私が見つけた唯一の用途は、ObjectID を保持しながらストアからストアへオブジェクトをコピーすることです。

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

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

[eta.:最初のメソッドと他の2つのメソッドのもう一つの重要な違いは、以下の通りです。 existingObjectWithID:error: は決してフォールトを返さないということです。常にオブジェクト全体をフェッチしてくれます。これを避けようとする場合 (たとえば、大きな blob プロパティを持つフェッチにコストのかかるオブジェクトを扱う場合) は、 を巧みに使う必要があります。 objectWithID: あるいは objectRegisteredForID: を使うか、適切に設定されたフェッチリクエストを使うかです]。