0

私はこれを何度も繰り返してきましたが、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"];

My NSLog shows that there is a NSManagedObject to assign the relationship to, and I have double checked the name in the forKey: that there are no typos. All that Xcode tells me is that it prints out '(null)' on my console and then tells me 'libc++abi.dylib: terminate called throwing an exception' on the next line.

Why is it crashing? And how do I fix it?

Update: That's the entire error message.

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

2 に答える 2

1

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:カートモデルを生成すると自動的に追加されます。)


編集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

モデルを正しく生成した場合。

于 2012-07-03T22:56:04.397 に答える
1

私が見る1つの問題は、エラーオブジェクトをチェックしていないことです。エラーが発生した場合、queryResultsは= nilになる可能性が高く、その後カウントをチェックしようとするとクラッシュします。少なくとも、nil状態を確認してください。

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

if( queryResults == nil ) return; // Or better yet check the value of Error.
于 2012-07-03T23:54:56.423 に答える