我已经一遍又一遍地检查了这个问题,但终究无法弄清楚为什么通过 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: terminate called throwing an exception”。
为什么会崩溃?我该如何解决?
更新:这就是完整的错误消息。
2012-07-03 18:28:57.844 appName[3063:11603] (null)
libc++abi.dylib: terminate called throwing an exception
(lldb)
最佳答案
好吧,没有足够的调试信息...因为您只需要检查 queryResults
是否有对象,所以我将使用
[newItem setValue:[queryResults lastObject] forKey:@"cartThatHasItem"];
代替
if ([queryResults count] == 1) [newItem setValue:[queryResults objectAtIndex:0] forKey:@"cartThatHasItem"];
不确定它是否能解决您的问题,但值得一试。 :)
编辑
通过你的问题标题'...对于多对多关系',我想知道 cartThatHasItem
和 Cart
之间的关系是什么?如果是多对一或多对多,则 cartThatHasItem
的数据类型将为 NSSet
。因此,您需要将 [queryResults objectAtIndex:0]
' 包装成
[newItem setValue:[NSSet setWithObject:[queryResults objectAtIndex:0]]
forKey:@"cartThatHasItem"];
,或者你可以使用
[newItem addCartThatHasItem:[queryResults objectAtIndex:0]]
相反。 (addCartThatHasItem:
将在您生成 Cart 模型时自动添加。)
编辑 2
购物车模型应该是这样的:
@interface Cart : NSManagedObject
//...
@property (nonatomic, retain) NSSet *cartThatHasItem;
@end
@interface Cart (CoreDataGeneratedAccessors)
//...
- (void)addCartThatHasItemObject:(CartThatHasItem *)value;
- (void)removeCartThatHasItemObject:(CartThatHasItem *)value;
- (void)addCartThatHasItem:(NSSet *)values;
- (void)removeCartThatHasItem:(NSSet *)values;
@end
如果您正确生成模型。
关于iphone - 使用 setValue :forKey: for many-to-many relationship 时核心数据应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320123/