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

Основные данные - идентификатор первичного ключа в строке в базе данных

Предположим, у меня есть список книг, хранящихся в Core Data. Я хочу найти книгу по ее идентификатору первичного ключа. Я знаю, что файл sqlite, созданный Core Data, имеет столбец идентификатора в каждой таблице, но, похоже, это не похоже на меня.

Есть ли у кого-нибудь рекомендации?

Спасибо!

4b9b3361

Ответ 1

-[NSManagedObject objectID] - уникальный идентификатор экземпляра объекта в Core Data. Его можно сериализовать через -[NSManagedObjectID URIRepresentation]. Вы можете получить objectID из координатора постоянного хранилища с помощью -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:], а затем получить объект из контекста управляемого объекта с помощью -[NSManagedObjectContext objectWithID:].

НО

Вы должны иметь в виду, что Core Data не является ORM. Это структура управления графами объектов. Это использует SQLite (и уникальные идентификаторы строк), поскольку бэкэнд - это просто деталь реализации. Чем скорее вы сможете избавиться от мышления SQL/RDBMS, тем быстрее вы будете довольны Core Data. Вместо того, чтобы пытаться найти объект из сохраненного идентификатора, подумайте, зачем вам нужен этот объект и какой объект ему нужен. Если экземпляр класса Foo должен быть способен получить экземпляр класса Bar, почему бы просто не создать ассоциацию из Foo в Bar и установить соответствующий экземпляр Bar в качестве целевого ассоциации в соответствующем экземпляре Foo. Пусть Core Data отслеживает идентификаторы объектов.

Ответ 2

Как сказал Барри Варк, всегда помните, что Core Data не является ормом. Чистая информация SQL не предоставляется пользователю, и каждая строка является всего лишь объектом. Кстати, когда-нибудь вам нужно будет получить доступ к "первичному ключу", например, когда вам нужно синхронизировать db-серверы с внешними базами данных sql (в моем случае мне это понадобилось в функции обратного вызова, чтобы изменить состояние объекта после INSERT это с успехом в удаленной db). В этом случае вы можете использовать:

objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString]

который вернет строку типа: x-coredata://76BA122F-0BF5-4D9D-AE3F-BD321271B004/Object/p521, которая является уникальным идентификатором, используемым coredata для идентификации этого объекта.

Если вы хотите вернуть объект с этим уникальным идентификатором:

NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]];

Примечание. Помните, что если ресивер еще не был сохранен в Контексте CoreData, идентификатор объекта является временным значением, которое будет изменяться при сохранении объекта.