Использование картографических моделей для миграции между базовыми моделями объектов данных - PullRequest
0 голосов
/ 22 мая 2010

У меня довольно простая схема. По сути, Run <-> Data (где Run содержит данные, например, Температура, взятые из какого-либо датчика).

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

Следовательно, Run <- >> Sample and Sample <-> Data. (И для простоты пока я оставляю Run <-> Data на месте.)

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

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

Например, если я возьму отображение «Образец» (у которого нет источника) и установлю для его источника значение «Выполнить» (чтобы я мог соответствующим образом установить обратное отношение «Образца» для выполнения), тогда сопоставление изменит свое имя на « RunToSample». В этом отображении обрабатываются две взаимосвязи: данные и прогон. Свойство data автоматически устанавливается на

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "DataToData", $source.dataSet)

Следуя этому примеру, я установил для свойства run значение

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "RunToRun", $source)

Аналогично, я установил отображение свойства sample в RunToRun на

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "RunToSample", $source)

и свойство sample в DataToData для

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "RunToSample", $source.run)

Так, что, мне интересно, идет не так? Я пробовал различные перестановки, например, оставляя «обратные» отношения неуказанными. Но я продолжаю получать ту же ошибку (134110) независимо от этого.

Я представляю, что это намного проще, чем кажется, и что мне не хватает какой-то фундаментальной, но незначительной части. Я также попытался создать подклассы NSEntityMigrationPolicy и переопределить -createDestinationInstancesForSourceInstance: но эти усилия дали почти одинаковые результаты.

Заранее спасибо за любые указатели или (соответствующие :-) советы.

Редактировать: Для простоты я пометил все отношения как необязательные. Хотя, в конечном счете, я могу выбрать иное.

1 Ответ

1 голос
/ 15 октября 2010

Используя следующее, я смог лучше понять, что происходит (и идет не так):

        NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyDataStore.sqlite"]];

    NSError *error = nil;
    NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                    URL:storeUrl
                                                                    error:&error];

    if (!sourceMetadata)
        {
        DLog(@"sourceMetadata is nil");
        }
    else
        {
        DLog(@"sourceMetadata is %@", sourceMetadata);
        }

Кроме того, мне нужно было тщательно упорядочить свои отображения сущностей.И я обнаружил, что - [NSMigrationManager destinationInstancesForEntityMappingNamed: sourceInstances:] абсолютно необходим для копирования «отношений».Например,

    NSSet *runs = [source valueForKey:@"allRuns"];
for (Run *srcRun in runs)
    {
    NSArray *temp = [manager destinationInstancesForEntityMappingNamed:@"RunToRun"
                                sourceInstances:[NSArray arrayWithObject:srcRun]];
    if ([temp count])
        {
        Run *dstRun = (Run*)[temp lastObject];
        [dest addAllRunsObject:dstRun];
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...