2011-01-18 4 views
36

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

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

Спасибо!

ответ

94

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

НО

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

+33

Хотел бы я дать вам еще один плюс для «Core Data - это не база данных». – Abizern

+5

Существуют распространенные случаи, когда вам нужно захватить объект по его идентификационным данным - передача данных из ячейки ячейки таблицы в контроллер подробного представления. Вы можете просто передать объект сам, но часто вы не хотите этого делать, если вы используете другой контекст в деталях VC. – memmons

+1

@ Майкл: Точно. Какова наилучшая практика для этого? – Noah

42

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

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

, который возвращает строку, как: х-CoreData: // 76BA122F-0BF5-4D9D-AE3F-BD321271B004/Объект/P521, который является уникальным идентификатором, используемым для CoreData идентифицировать этот объект.

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

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

NB: Помните, что если приемник не был сохранен в контексте CoreData, ИД объекта является временным значением, которое будет при сохранении объекта.

+1

точно! та же проблема. необходимо отправить серверу этот идентификатор с данными сущностей, чтобы сделать запись в удаленный mySQL, а затем в ответ получить уникальный идентификатор сервера с тем же идентификатором объекта. получить объектную форму objectId и сохранить в нем идентификатор сервера. –

+0

Спасибо за объяснение и код nyc ... решил мою проблему .. :) –

+0

@donnit, amogh Итак, что мне делать в ситуации, когда я сохраняю контент за пределами сайта, а затем, когда мне нужно заполнить конец сервера, способный сопоставлять значения Id и update? а также иметь возможность добавлять новый объект, если идентификатор не существует в базе данных. Как бы я это сделал? – Pavan

Смежные вопросы