0

私はかなり単純なスキーマを持っています。基本的に、Run <--> Data (Run には、ある種のセンサーからサンプリングされた温度などのデータが保持されます)。

現在、センサーは複数の測​​定値 (温度と湿度など) を持つことができるようです。そのため、1 つの実行に複数のデータ サンプルが含まれる場合があります。

したがって、<-->> サンプルとサンプル <--> データを実行します。(簡単にするために、今のところ Run <--> Data はそのままにしておきます。)

新しいマッピング モデルを作成すると、通常は機能しますが、新しいサンプルが作成されないこと、実行とサンプルの間、またはサンプルとデータの間に関係が確立されないことを除きます。

モデルを移行するためにマッピング モデルを取得しようとしていますが、生成されたマッピング モデルを少しでも変更すると、Cocoa エラー 134110 が発生します。

たとえば、"Sample" マッピング (ソースを持たない) を取得し、そのソースを "Run" に設定すると (Sample の逆関係を適切に "run" に設定できるようにするため)、マッピングはその名前を "RunToSample" に変更します。このマッピングでは、data と run の 2 つの関係が処理されます。data プロパティは自動的に次のように設定されます。

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

この例に従って、run プロパティを

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

同様に、RunToRun の「サンプル」プロパティ マッピングを次のように設定します。

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

および DataToData の 'sample' プロパティを使用して

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

それで、何がうまくいかないのだろうか?「逆」関係を未指定のままにするなど、さまざまな順列を試しました。しかし、それでも同じエラー (134110) が引き続き発生します。

これは思ったよりずっと簡単で、基本的ではあるがマイナーな部分が欠けていると思います。また、NSEntityMigrationPolicy のサブクラス化と -createDestinationInstancesForSourceInstance: のオーバーライドを試みましたが、これらの努力はほとんど同じ結果に達しました。

ポインタや(関連する:-)アドバイスをよろしくお願いします。

編集: 簡単にするために、すべての関係をオプションとしてマークしました。とはいえ、最終的には別の選択をするかもしれません。

4

1 に答える 1

1

以下を使用して、何が起こっているか (そして間違っているか) をよりよく理解することができました。

        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];
        }
    }
于 2010-10-15T17:08:03.417 に答える