核心数据:将NSMutableArray中的对象添加到NSMutableSet?

时间:2011-07-26 22:10:07

标签: iphone objective-c core-data nsmutablearray

从提出的相关问题的数量来看,这看起来像一个经常被问到的问题,这让我更加犹豫不决。我已经查看过这些问题中的大多数问题,但它们似乎都没有解决我遇到问题的具体问题。

关于我正在努力实现的目标,我将如何实现以及我遇到的问题的一些背景信息:

我正在尝试解析XML Web服务,将该数据加载到NSMutableArray(或者我以后可以从中访问它的任何其他位置),然后获取我的数据并将其加载到我的Core Data模型中。我可以做的第一部分,一旦我在数组中获取信息并尝试将其加载到Core Data中,我似乎无法进展。

我的模型(针对此问题进行了简化)包含一个与检查点实体具有一对多关系的路由实体。我试图加载的数据是我的路由实体中的各种属性信息,它不包含在我的数组中,然后是我的检查点列表,这是数组的内容。我的问题是我无法可靠地添加我的整个检查点数组然后保存。对于我用于开发的静态情况,我有一个一致的20个检查点被解析到我的NSMutableArray中,其中,我已经能够转移到我的NSMutableSet,我的路由实体的检查点部分是7,然后崩溃发送了SIGABRT或EXC_BAD ACCESS或错误的选择器。我一直在试图找出今天更好的部分而没有运气。现在有些代码:

NSManagedObjectContext *context = [appDelegate managedObjectContext];

    //newRoute is the route that I am trying to create and then store persistently
    newRoute = [NSEntityDescription insertNewObjectForEntityForName:@"Route" inManagedObjectContext:context];

    //filling in some available attribute information
    if (name.text == @"")
        [newRoute setValue:[NSDate date] forKey:@"name"];
    else
        [newRoute setValue:name.text forKey:@"name"];

    NSMutableSet *muteSet = [newRoute mutableSetValueForKey:@"myCheckpoints"];

    for (int i = 0; i < [appDelegate.checkpoints count]; i++ )
    {
        Checkpoint *newCheckpoint = [[Checkpoint alloc] init];
        [newCheckpoint setName:[[appDelegate.checkpoints objectAtIndex:i] valueForKey:@"name"]];

        NSLog(@"Appending %@ to set", newCheckpoint.name);
        [muteSet addObject:newCheckpoint];

        [newCheckpoint release];
    }

    //myCheckpoints is the route<-->>checkpoints relationship 
    [newRoute setValue:muteSet forKey:@"myCheckpoints"];

    // Save the context.
    NSError *error = nil;
    if (![context save:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

出于好奇,为什么以下不起作用?

NSSet *ckPtSet = [[NSSet alloc] initWithArray:appDelegate.checkpoints];     
[newRoute setValue:ckPtSet forKey:@"myCheckpoints"];

据我了解,这可能是问题所在......在设置myCheckpoints的值时,期望是传递给NSSet。使用调试器时,初始化集实际上包含20个对象,但是当我尝试跳过时,我再次收到错误的选择器接收错误。

无论如何,感谢您花时间阅读我的文字墙,如果您需要更多帮助请告诉我,我会尽快添加! -Karoly

1 个答案:

答案 0 :(得分:1)

[id<NSKeyValueCoding> mutableSetValueForKey:]的文档指出它返回一个可变集合代理,该代理提供对给定密钥指定的无序多对多关系的读写访问。这意味着该对象返回不一定是NSMutableSet实例本身,而是代理,其中您对该对象所做的任何更改都会反映在模型的集合本身中。

这可能是[newRoute setValue:muteSet forKey:@"myCheckpoints"];给你带来麻烦的原因。我发现考虑它的一个更好的方法是有一个中间对象,但嵌套调用,例如:

[[newRoute mutableSetValueForKey:@"myCheckpoints"] addObject:newCheckpoint];