iphone - 使用 setValue :forKey: for many-to-many relationship 时核心数据应用程序崩溃

标签 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: 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"];

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


编辑

通过你的问题标题'...对于多对多关系',我想知道 cartThatHasItemCart 之间的关系是什么?如果是多对一或多对多,则 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/

相关文章:

ios - Swift GameCenter 行为不正常

ios - 水平 CollectionView Swift iO 中的垂直 CollectionView

ios - Coredata PerformBlock 然后返回新值

ios - 如何在 Swift 中将 NSSet 转换为 NSMutableSet

iphone - 向我的应用程序添加 float View

iphone - 如何根据 BOOL 值从其他类隐藏已实现的委托(delegate)方法? - objective-c

iPhone:将 FPPopover 类与 UIBarButtonItem 一起使用时出错

ios - 适用于 Xcode 6 的 iPhone 4 模拟器

iphone - 如何阻止 MPMoviePlayerController 在 iOS4.0+ 中的 iPod 控件上显示我的应用程序图标?

ios - 存储多条记录的核心数据混淆