Основные данные - идентификатор первичного ключа в строке в базе данных
Предположим, у меня есть список книг, хранящихся в Core Data. Я хочу найти книгу по ее идентификатору первичного ключа. Я знаю, что файл sqlite, созданный Core Data, имеет столбец идентификатора в каждой таблице, но, похоже, это не похоже на меня.
Есть ли у кого-нибудь рекомендации?
Спасибо!
Ответы
Ответ 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, идентификатор объекта является временным значением, которое будет изменяться при сохранении объекта.