使用setValue时,Core Data应用程序崩溃:forKey:用于多对多关系

时间:2012-07-03 22:30:24

标签: iphone ios core-data

我一遍又一遍地重复这一点,并且不能为我的生活找出为什么通过setValue分配关系:forKey:不起作用。我的方法如下。

-(void)saveNewCartItemName:(NSString *)name Price:(float)price Qty:(int)qty Tax:(int)tax inCart:(NSDate *)cartDate{
    NSManagedObject *newItem = [NSEntityDescription insertNewObjectForEntityForName:@"Item"
                                                             inManagedObjectContext:self.appDelegate.managedObjectContext];

    NSFetchRequest *query = [[NSFetchRequest alloc] initWithEntityName:@"Cart"];
    NSLog(@"cartDate = %@", cartDate);
    [query setPredicate:[NSPredicate predicateWithFormat:@"cartDate = %@", cartDate]];
    NSError *error;
    NSMutableArray *queryResults = [[self.appDelegate.managedObjectContext executeFetchRequest:query error:&error] mutableCopy];
    NSLog(@"queryResults count = %d", [queryResults count]);
    if ([queryResults count] == 1) [newItem setValue:[queryResults objectAtIndex:0] forKey:@"cartThatHasItem"];
    [newItem setValue:name forKey:@"itemName"];
    [newItem setValue:[NSNumber numberWithFloat:price] forKey:@"itemPrice"];
    [newItem setValue:[NSNumber numberWithInt:qty] forKey:@"itemQty"];
    [newItem setValue:[NSNumber numberWithInt:tax] forKey:@"itemTax"];

    [self.appDelegate.managedObjectContext save:&error];
}

每次崩溃的行是:

if ([queryResults count] == 1) [newItem setValue:[queryResults objectAtIndex:0] forKey:@"cartThatHasItem"];

我的NSLog显示有一个NSManagedObject来分配关系,我已经仔细检查了forKey中的名称:没有拼写错误。 Xcode告诉我的是,它在我的控制台上输出'(null)'然后告诉我'libc ++ abi.dylib:在下一行终止调用抛出异常'。

为什么会崩溃?我该如何解决?

更新:这是整个错误消息。

2012-07-03 18:28:57.844 appName[3063:11603] (null)
libc++abi.dylib: terminate called throwing an exception
(lldb)

2 个答案:

答案 0 :(得分:1)

嗯,没有足够的调试信息...因为你只需要检查queryResults是否有一个对象,所以我会用

[newItem setValue:[queryResults lastObject] forKey:@"cartThatHasItem"];

而不是

if ([queryResults count] == 1) [newItem setValue:[queryResults objectAtIndex:0] forKey:@"cartThatHasItem"];

不确定它是否会解决您的问题,但值得尝试。 :)


修改

通过你的问题标题'...多对多关系',我想知道cartThatHasItem&之间的关系是什么? Cart?如果它是多对一或多对多,则cartThatHasItem的数据类型将为NSSet。所以,你需要像{/ 1}}一样包装

[queryResults objectAtIndex:0]

,或者您可以使用

[newItem setValue:[NSSet setWithObject:[queryResults objectAtIndex:0]]
           forKey:@"cartThatHasItem"];

代替。 ([newItem addCartThatHasItem:[queryResults objectAtIndex:0]] 将在您生成购物车模型时自动添加。)


编辑2

购物车模型应该是这样的:

addCartThatHasItem:

如果您正确生成模型。

答案 1 :(得分:1)

我看到的一个问题是你没有检查错误对象。如果发生错误,那么queryResults可能是= nil,并且您随后尝试检查计数将使您崩溃。至少检查零条件:

NSMutableArray *queryResults = [[self.appDelegate.managedObjectContext executeFetchRequest:query error:&error] mutableCopy];

if( queryResults == nil ) return; // Or better yet check the value of Error.