Миграция CoreData от одного ко многим ко многим ко многим - PullRequest
1 голос
/ 26 июля 2011

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

У меня есть абстрактная сущность «Клиент», которая содержит общие отношения с телефонными номерами, адресами электронной почты и т. Д. В моей старой модели были отношения, в которых клиент мог владеть 1 собственностью (но у собственности могло быть много владельцев), или клиент мог быть арендатором в аренде (но в аренде может быть много арендаторов). Сейчас я обновил модель так, чтобы Клиент мог владеть многими свойствами и быть частью многих договоров аренды.

Конкретные сущности Клиента в основном добавляют различную информацию об именах в реферат, поэтому существуют подклассы Индивидуальный, Бизнес, Правительственный и Импорт (импортированные из других систем).

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

Старая модель:

Client{
   Property<<-->Property.Owners
   Tenancy<<-->Lease.Tenants
}
ImportClient:Client{
   name:string
}

Новая модель:

Client{
  Properties<<-->>Property.Owners
  Tenancies<<-->>Lease.Tenants
}
ImportClient:Client{
  name:string
}

Так что теперь о возможных проблемах я могу видеть. Во-первых, имена отношений в сущности «Клиент» изменились с «Недвижимость» на «Свойства» и «Аренда в аренду». Итак, я добавил модель отображения. Модель не добавляла автоматически сопоставление сущностей для ClientToClient (только для конкретных классов), поэтому я попытался добавить его самостоятельно. Однако я не уверен, как настроить выражение значения, так что на данный момент это:

 FUNCTION($manager,"destinationInstancesForEntityMappingName:sourceInstances:","PropertyToProperty","$source.Property")

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

Так что я подозреваю, что либо не удается передать отношения, потому что, когда выборка запускается для объекта Client, она ничего не возвращает (всякий раз, когда я пытался это сделать, это было так), или я просто не получал выражение значения правый.

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

1 Ответ

1 голос
/ 10 августа 2011

Итак, решение, которое я нашел (для тех, кто сталкивается с этим позже ...) в общих чертах, поскольку у меня нет времени, чтобы подробно описать весь код здесь.

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

Шаг 2. Извлечение метаданных хранилища с помощью [NSPersistentStoreCoordinator metadataForPersistantStore ...]

Шаг 3: Загружайте свои старые модели по одной от самой последней до самой старой и используйте [NSManagedModel isConfiguration: compatibilityWithStoreMetadata:], пока не найдете модель, которая работает

Шаг 4. Создайте постоянное хранилище с работающей моделью, а затем создайте контекст управляемого объекта из хранилища данных и постоянного хранилища

Шаг 5: Кэшируйте ошибочные отношения в словаре (я использовал пары UUID для идентификации объектов)

Шаг 6. Выполнение упрощенного обновления хранилища данных с использованием текущей модели управляемых объектов

Шаг 7: Пройдите по словарям, выбирая пары объектов и связывая их снова

Да, вам придется использовать свои собственные навыки кодирования для реализации этого (для моего примера это примерно 250 строк кода), но, надеюсь, это семя, которое вам нужно, чтобы оно заработало ...

...