我一遍又一遍地重复这一点,并且不能为我的生活找出为什么通过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)
答案 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]]
将在您生成购物车模型时自动添加。)
购物车模型应该是这样的:
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.