Подтвердить что ты не робот

Как получить объект Core Data из определенного идентификатора объекта?

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

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];

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

4b9b3361

Ответ 1

Вы хотите:

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

Выбирает объект из хранилища, имеющего этот идентификатор, или nil, если он не существует.

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

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

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

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

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

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

Ответ 2

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

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