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") が複数回使用される場合があります。さらに、項目の順序も重要です。
NSSet
3.) Core-Data は、 ( )を使用しているため、複数の関係を同じオブジェクトに保存することをサポートしていませんNSOrderedSet
。また、すべての double オブジェクトを無視します。
どうすれば問題を解決できるか考えている人はいますか?
失敗した私の試み:
1.) 新しいコア データ テーブル (AB) を挿入します。
- Aへの参照があります
- 位置フィールドがあります
- A から 1 つの B への参照があります
RKValueTransformer
2.) オブジェクトをインスタンスにマップしようとしました。これにより、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' を確立しようとする不正な試み しかし、私は常に同じコンテキストを使用します。
より良いアイデアがない場合、この問題の解決策はありますか?