данные ядра - идентификатор первичного ключа строки в базе данных - PullRequest
40 голосов
/ 18 января 2011

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

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

Ответы [ 2 ]

98 голосов
/ 18 января 2011

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

НО

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

43 голосов
/ 04 июля 2011

Как сказал Барри Уарк, всегда помните, что Базовые Данные не являются формой. Сведения о чистом SQL не предоставляются пользователю, и каждая строка является просто объектом. Кстати, иногда вам нужно получить доступ к «первичному ключу», например, когда вам нужно синхронизировать базу данных coredata с внешними базами данных sql (в моем случае она понадобилась мне в функции обратного вызова для изменения состояния объекта после INSERT это с успехом в удаленном БД). В этом случае вы можете использовать:

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, идентификатор объекта является временным значением, которое изменится при сохранении объекта.

...