Как получить объект Core Data из определенного идентификатора объекта? - PullRequest
117 голосов
/ 18 февраля 2011

Я легко могу получить идентификатор объекта в Базовых данных, используя следующий код:

NSManagedObjectID *moID = [managedObject objectID];

Однако есть ли способ вывести объект из основного хранилища данных, присвоив ему конкретный идентификатор объекта? Я знаю, что могу сделать это с помощью 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];

Однако я хотел бы сделать это так, чтобы не инициировать собственный запрос на выборку. Есть идеи?

Ответы [ 3 ]

203 голосов
/ 18 февраля 2011

Вы хотите:

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

Извлекает объект из магазина, у которого есть этот идентификатор, или ноль, если он не существует.

(Имейте в виду: есть два метода наNSManagedObjectContext с похожими именами, которые сбили меня с толку. Чтобы помочь им оставаться прямыми, вот что делают два других:

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

... создаст объект ошибки с предоставленным objectID, лиили нет такой объект действительно существует в хранилище. Если он не существует, все, что вызывает ошибку, завершится неудачей, если вы сначала не вставите объект с помощью NSManagedObjectContext insertObject:. Единственное использование, которое я нашел для этого, этокопирование объектов из хранилища в хранилище при сохранении идентификаторов объектов.

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

... вернет объект, имеющий этот идентификатор, , если он был выбран из хранилища с помощью управляемогоObjectContext.Кто-нибудь знает, для чего этот метод полезен, пожалуйста, прокомментируйте.)

[eta .: Другое важное различие между первым методом и двумя другими состоит в том, что existingObjectWithID:error: никогда не возвращаетсяs ошибка;он всегда выбирает весь объект для вас.Если вы пытаетесь избежать этого (например, работаете с дорогим для извлечения объектом с большим свойством большого двоичного объекта), вы должны быть умны с objectWithID: или objectRegisteredForID:, которые не вызывают сбои;или используйте правильно настроенный запрос на выборку.]

4 голосов
/ 07 августа 2014

objectWithID: - это метод, который вы ищете, и это рекомендуемый способ сделать это. objectWithID: будет эффективно использовать NSManagedObjectContext для извлечения объекта только на столько уровней, сколько необходимо - в отличие от некоторых других способов сделать это. objectWithID: будет правильно использовать информацию в памяти в родительских контекстах, координаторе постоянного хранилища и самом постоянном хранилище перед переходом в резервное хранилище.

Этот вопрос подробно рассматривается в WWDC 2012 сессии "Основные рекомендации по основным данным".

0 голосов
/ 06 июля 2019

Swift 5 версия:

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

есть также методы object(with:) или registeredObject(for:). В зависимости от того, что вам нужно.

...