2017-01-09 2 views
0

Я строю простое приложение в Swift с использованием Core Data и пытаюсь решить, должен ли я хранить уникальный идентификатор в своих объектах. В моих исследованиях я нашел примеры этого и примеры, которых нет, но я не нашел ясных аргументов в пользу такого решения.Какие вопросы я должен задать себе, чтобы определить, нужен ли мне первичный ключ для моего приложения Core Data?

Пожалуйста, обратите внимание: - Я родом из РСУБДА фона, и я знаю, что ядро ​​данные является объектным графом, не является реляционной БД - Я знаю, что основные данные создает NSManagedObjectID, но как я могу определить, если такую ​​волю быть достаточно

Я вижу темы, как this (от 7 лет назад, кстати), который выкладывает эти варианты:

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

, но я не смог найти много информации о том, какие варианты являются подходящими для которых ситуации.

Какие вопросы я должен задавать себе, чтобы выяснить, есть ли уникальный идентификатор Core Data (NSManagedObjectID), который мне нужен, или если я должен выйти за рамки этого и выбрать включить один из моих собственных в микс.

+0

Я не кодер данных с основными данными (только с ним обходился), но я всегда думал, что для модели есть два возможных «источника» - mySQL или XML-файл. Будучи человеком MSSQL сам в прошлой жизни, я думаю, что любой дизайн БД, который вам нравится, будет достаточным для ответа. На самом деле, есть аргументы, которые я читал, что компакт-диск иногда является ненужным слоем, и использование прямого дизайна mySQL упрощает работу. (Эти аргументы иногда утверждают, что максимальная сила CD - это постоянство.) – dfd

ответ

0

Единственная причина использования ваших собственных уникальных идентификаторов с основными данными - если вы когда-либо синхронизировали данные с другим устройством или веб-службой. NSManagedObjectID достаточно для местного использования, но они не работают хорошо для синхронизации. Например, если вы получаете данные с вашего серверного сервера, у него, вероятно, есть уникальные идентификаторы, но вы не можете заставить Core Data использовать их. Аналогично, даже если ваша синхронизация связана с другим устройством iOS, вы не можете заставить Core Data на втором устройстве использовать тот же NSManagedObjectID, как и на первом.

Для местного использования NSManagedObjectID - это все, что вам нужно. Если вам нужно сохранить ссылку на управляемый объект в настройках по умолчанию пользователя, вы можете сохранить это. Позже вы можете использовать object(with:) или existingObject(with:), чтобы быстро получить управляемый объект.

+0

С риском заявить о очевидном, Том, вы говорите, что если позже я добавлю возможность синхронизировать устройства iOS с помощью iCloud, мне нужно управлять своими уникальными идентификаторами. Верный? – Jim

+0

Да, потому что вы не можете использовать 'NSManagedObjectID' на стороне сервера. Вам нужен другой идентификатор, чтобы сообщить серверу, что вы обновляете, или понять входящие данные с сервера. –

0

if Core Data's unique identifier (NSManagedObjectID) is all I need

Нужно с какой целью?

Основные данные хранят первичные ключи объекта внутри, поэтому вам в основном не нужно выполнять их самостоятельно. В CD вы взаимодействуете с объектами, у которых уже есть механизм для установления отношений. Вы просто должны назначить одну NSManagedObject к свойству другого NSManagedObject и что будет представлять собой O2O или O2M отношения, как это:

anotherObject.parent = oneObject; 

для многочастичных стороны будет набор для этого. Посмотрите на documentation.

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

Возможно, вас заинтересует этот post, если вам нужно сохранить ссылку на некоторые данные NSManagedObject по умолчанию для пользователей.

И, кстати, есть [[NSUUID UUID] UUIDString].

+0

Я думал о нескольких целях, таких как: 1) У меня есть UISegmentedControl, который контролирует некоторые пользовательские варианты по умолчанию, и создание уникальных идентификаторов этих 0 и 1 делает его очень легким установить/изменить выбранное значение этого элемента управления и сохранить значение индекса в 'NSUserDefaults'2), чтобы избежать совпадения вещей с помощью' String' во многих случаях (не для определения отношений, хотя), и 3) кажется, было бы легче изменить , скажем, свойство «описания» конкретной уникальной записи, которая может быть «одной» в «один-много» по дороге после моего приложения. – Jim

+0

И тогда я также вижу действительно умных ребят Apple (https://vimeo.com/140037432), которые использовали что-то вроде 'newTask.setValue (NSUUID(). UUIDString, forKey:« id »)' в своих примерах, поэтому он делает я думаю, что должна быть веская причина. – Jim

+0

'NSManagedObjectID' относится к определенному объекту в определенном хранилище. Таким образом, вы можете безопасно использовать его, если вам не нужно обмениваться данными с каким-либо внешним приложением. См. Раздел [Обзор] (https://developer.apple.com/reference/coredata/nsmanagedobjectid?language=objc#overview) документации. – bteapot

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