从提出的相关问题的数量来看,这看起来像一个经常被问到的问题,这让我更加犹豫不决。我已经查看过这些问题中的大多数问题,但它们似乎都没有解决我遇到问题的具体问题。
关于我正在努力实现的目标,我将如何实现以及我遇到的问题的一些背景信息:
我正在尝试解析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
答案 0 :(得分:1)
[id<NSKeyValueCoding> mutableSetValueForKey:]
的文档指出它返回一个可变集合代理,该代理提供对给定密钥指定的无序多对多关系的读写访问。这意味着该对象返回不一定是NSMutableSet
实例本身,而是代理,其中您对该对象所做的任何更改都会反映在模型的集合本身中。
这可能是[newRoute setValue:muteSet forKey:@"myCheckpoints"];
给你带来麻烦的原因。我发现考虑它的一个更好的方法是不有一个中间对象,但嵌套调用,例如:
[[newRoute mutableSetValueForKey:@"myCheckpoints"] addObject:newCheckpoint];