2017-02-21 32 views
-1

Это сценарий:объектов Синхронизировать CoreData с использованием секретного ключа, но сохранить уникальный идентификатор объекта одинаковы для отношений

У меня есть managedObject:

Category

С свойствами:

categoryId String 
categoryName String 
subCategory SubCategory 

SubCategory managedObject имеет объекты:

categoryId String 
categoryName String 
categoryInverse Category 
contractInverse Contract 

Contract managedObject обладает свойствами:

contractId String 
contractName String 
subCategoryInverse SubCategory 

Я получаю Категория и Подкатегорий данные в формате JSON из веб-службы, а затем создать контракты, которые привязаны к категории и суб-категории по средства обратных отношений.

Проблема заключается в том, когда я получить свежий список Categories и подкатегорий с сервера при запуске приложения, я удалить предыдущую Categories и SubCategories и заполнить их новыми данными. Это, в свою очередь, разрушает отношения, и новый объект Contract имеет nil для объекта ПОДКАТЕГОРИИ, который был бы моя ссылкой на Category объект (contract.subCategoryInverse.categoryInverse)

Как я могу обновить Category/SubCategory данные без потери существующих отношений?

+0

Очевидная вещь будет не удалять существующие объекты, но обновлять их на месте. Почему вы удаляете все при запуске приложения? –

+0

Есть ли простой способ обновления записей, а не удаления всех и добавления новых объектов? Особенно, если сервер не поддерживает какие-либо стратегии синхронизации. – NSFeaster

+0

Извлеките существующие записи, измените их значения и сохраните изменения. –

ответ

1
  1. Получить данные обновления с сервера
  2. Fetch все ваши категории
  3. Поместите их все в словаре с CategoryId в качестве ключа и managedObject в качестве значения.
  4. Также поместите все категории managedObjects в mutableSet categoriesToDelete.
  5. Теперь пройдите через данные вашего сервера, чтобы получить категорию по идентификатору из словаря. Если его там нет, создайте его. Если он есть, удалите его с categoriesToDelete и обновите его.
  6. Удалить все объекты в categoriesToDelete
  7. Сделайте то же самое для подкатегорий