Основной ключ первичных данных

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

NSManagedObjectID *moID = [managedObject objectID];

Ответ 4

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

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

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

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

пользоваться

Ответ 5

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

Я сделал метод утилиты, проверьте его здесь

Ответ 6

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