Миграция CoreData от «один ко многим» к «многие ко многим»

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

У меня есть абстрактная сущность «Клиент», которая содержит общие отношения с номерами телефонов, адресами электронной почты и т. д. В моей старой модели были отношения, в которых клиент мог владеть 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, он ничего не возвращает (всякий раз, когда я пробовал, это было так), или я просто не получаю правильное выражение значения.

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


person Red Nightingale    schedule 26.07.2011    source источник
comment
Вам трудно понять старые и новые модели данных, описанные в абзаце. Возможно, вы захотите включить снимок экрана или представить объекты в текстовом формате, как это использовалось в этом моем предыдущем ответе stackoverflow.com/questions/6788913/   -  person TechZen    schedule 26.07.2011
comment
Я попробовал. Надеюсь, теперь это имеет больше смысла?   -  person Red Nightingale    schedule 27.07.2011


Ответы (1)


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

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

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

Шаг 3. Загружайте старые модели по одной, от самых последних до самых старых, и используйте [NSManagedModel isConfiguration: compatibleWithStoreMetadata:], пока не найдете работающую модель.

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

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

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

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

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

person Red Nightingale    schedule 10.08.2011