0

我对从JSON字符串到NSManagedObject. 我RestKit通过getObject请求和核心数据集成使用。我想自动映射 JSON 响应。

1.)我从网络服务获得以下响应(“A”对象):

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

2.) 此响应具有有序值(B 对象),有时同一对象(“id”:“abc”)不止一次。此外,项目的顺序很重要。

3.) Core-Data 不支持将多个关系保存到同一个对象,因为它使用了NSSet( NSOrderedSet)。它忽略了所有双重对象。

有谁知道我该如何解决这个问题?

我的尝试,失败了:

1.)我插入一个新的核心数据表(AB),其中:

  1. 有参考 A
  2. 有一个位置字段
  3. 有一个 B 的引用,来自 A

在此处输入图像描述

2.) 我尝试用RKValueTransformer实例映射对象。这会迭代JSONB 实例的响应并使用当前位置创建 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

您提出的模型结构是满足重复数据需求的明智解决方案。您应该在那里进行的唯一更改是确保所有关系都是双端的(具有逆向关系)并具有适当的多重性。确保关系 from BtoAB是对多的。from Ato的关系AB也应该是对多的。

对此的一般方法是使用多个响应描述符:

  1. 一、创建A对象和AB对象,关键路径是nil
  2. 一个创建B对象没有任何重复,关键路径是Bs

创建对象的响应描述符A具有嵌套关系映射来创建AB具有重复和顺序的对象 - 为此,您不能使用任何标识属性AB,您需要使用RestKit 提供的映射元数据。

一旦创建了对象,就需要将它们连接起来,这将通过外键映射来完成。这意味着在AB实例上存储一个瞬态属性,其中包含适当B对象的 id 并使用它来建立连接。

请注意,更新后,由于此操作,您可能在数据存储中拥有一些孤立对象(因为您不能使用 的标识属性AB),您应该考虑创建一个获取请求块以清除它们(或自己定期执行此操作)。

于 2014-08-01T09:58:50.197 回答