0

JSON文字列から へのオブジェクト マッピングに問題がありますNSManagedObject。リクエストと Core Data 統合RestKitを介して使用します。getObjectそして、JSON 応答を自動的にマップしたいと考えています。

1.) Web サービスから次の応答 (「A」オブジェクト) を取得します。

{
    "Bs":[
        { "id" : "abc", "name" : "name 1"}, 
        { "id" : "def", "name" : "name 2"}
        { "id" : "abc", "name" : "name 1"},
    ],
    "id": "1"
}

2.) この応答には順序付けられた値 (B オブジェクト) があり、同じオブジェクト ("id" : "abc") が複数回使用される場合があります。さらに、項目の順序も重要です。

NSSet3.) Core-Data は、 ( )を使用しているため、複数の関係を同じオブジェクトに保存することをサポートしていませんNSOrderedSet。また、すべての double オブジェクトを無視します。

どうすれば問題を解決できるか考えている人はいますか?

失敗した私の試み:

1.) 新しいコア データ テーブル (AB) を挿入します。

  1. Aへの参照があります
  2. 位置フィールドがあります
  3. A から 1 つの B への参照があります

ここに画像の説明を入力

RKValueTransformer2.) オブジェクトをインスタンスにマップしようとしました。これにより、B インスタンスの応答が繰り返されJSON、現在の位置で AB オブジェクトが作成されます。これらのオブジェクトはNSSet、カスタム値トランスフォーマーから返される に保存されます。

RKValueTransformer *aabbTransformer = [RKBlockValueTransformer valueTransformerWithValidationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) {
        return ([sourceClass isSubclassOfClass:[NSArray class]] && [destinationClass isSubclassOfClass:[NSOrderedSet class]]);
    } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) {
        // Validate the input and output
        RKValueTransformerTestInputValueIsKindOfClass(inputValue, [NSArray class], error);
        RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, [NSOrderedSet class], error);

        NSMutableOrderedSet *outputSet = [[NSMutableOrderedSet alloc] init];
        NSInteger pos = 1;
        for (id b in inputValue) {
            // see JSON output at the top
            // B instance already exists in core data persistent store
            NSString *bid = [b valueForKeyPath:@"id"];
            B *b = [B bById:bid];

            // create AB instance
            AB *ab = [NSEntityDescription ...]
            ab.b = b;
            ab.position = [NSNumber numberWithInteger:pos];

            [outputSet addObject:ab];
            pos++;
        }
        // return for A.abs
        *outputValue = [[NSOrderedSet alloc] initWithOrderedSet:outputSet];
        return YES;
    }];

    RKAttributeMapping *aabbMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"bs" toKeyPath:@"abs"];
    aabbMapping.valueTransformer = aabbMappingTransformer;

3.) しかし、エラーが発生します: 異なるコンテキスト内のオブジェクト間に関係 'abs' を確立しようとする不正な試み しかし、私は常に同じコンテキストを使用します。

より良いアイデアがない場合、この問題の解決策はありますか?

4

1 に答える 1

0

提案されたモデル構造は、重複データ要件に対する賢明なソリューションです。ここで行う必要がある唯一の変更は、すべての関係が両端 (逆) であり、適切な多重度を持つようにすることです。Bからへの関係ABが対多であることを確認してください。Aからへの関係ABも対多でなければなりません。

これに対する一般的なアプローチは、複数の応答記述子を使用することです。

  1. Aオブジェクトとオブジェクトを作成するための 1 つAB、キー パスはnil
  2. B重複のないオブジェクトを作成するための 1 つ、キー パスはBs

オブジェクトを作成するための応答記述子には、重複と順序でオブジェクトAを作成するためのネストされた関係マッピングがあります。ABこのため、識別属性を使用することはできず、RestKit によって提供されるマッピング メタデータABを使用する必要があります。

オブジェクトが作成されたら、それらを接続する必要があり、それは外部キー マッピングで行われます。これは、適切なオブジェクトABの ID を含む一時的な属性をインスタンスに格納し、それを使用して接続を確立することを意味します。B

AB更新後、この操作の結果としてデータ ストア内にいくつかの孤立したオブジェクトが存在する可能性があることに注意してください ( の識別属性を使用できないため)。それらをパージするフェッチ リクエスト ブロックを作成することを検討する必要があります (または、定期的に自分で行うこともできます)。 )。

于 2014-08-01T09:58:50.197 に答える