Основной ключ основных данных - PullRequest
74 голосов
/ 23 мая 2009

Это может показаться глупым, но я все еще не мог понять, как пометить атрибут как первичный ключ в файле xcdatamodel. Мое постоянное хранилище - файл sqlite. Кто-нибудь может мне помочь?

В таком случае, как я могу "подтвердить" идентификатор, чтобы он был уникальным? Должен ли я написать метод проверки или что-то?

Ответы [ 6 ]

87 голосов
/ 24 мая 2009

Ваши варианты:

  • Используйте -[NSManagedObject objectID]. Обратите внимание, что этот идентификатор является временным до тех пор, пока объект не будет сохранен в первый раз или вы не вызовете -[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
  • Используйте семейство функций CFUUID для генерации UUID для каждого объекта в вашем -awakeFromInsert методе
  • Создайте свою собственную систему, подобную первичному ключу, которая хранит целое число в вашей модели и увеличивает его при создании каждого объекта

Нет хорошего способа проверить, является ли свойство уникальным. Самое близкое, что вы получите, - это убедиться, что он уникален во время создания, а затем внедрите собственный метод установки, который не позволит никому когда-либо изменить ID.

43 голосов
/ 23 мая 2009

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

20 голосов
/ 23 мая 2009

Базовые данные создают свой собственный первичный ключ - вам не нужно его добавлять. Вы можете получить его с помощью

NSManagedObjectID *moID = [managedObject objectID];
14 голосов
/ 29 мая 2012

иногда при взломе нужен фактический int первичного ключа. вот как это можно схватить:

NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID];
int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];

несмотря на то, что CoreData является графом объектов, если взглянуть на сгенерированные CoreData данные базы данных SQLite, этот способ получения первичного ключа NSManagedObject не должен быть проблемой. Я использовал CoreData и низкоуровневую библиотеку sqlite3 C вместе в одном коде, и передача первичных ключей из CoreData в sqlite3 для извлечения записей работает очень хорошо.

! если вы намереваетесь использовать этот код в производственной среде, имейте в виду возможные внутренние изменения того, как первичный ключ db преобразуется в URIRepresentation, это может затормозить ваш код.

наслаждаться

0 голосов
/ 13 августа 2013

Я бы предпочел использовать Время + имя класса в качестве уникального идентификатора.

0 голосов
/ 13 декабря 2012

Без взлома NSManagedObjectID вы можете выполнить быструю проверку своего атрибута, прежде чем управлять удаленным сбором данных.

Я сделал служебный метод, проверьте его здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...