私のモデルには、次のコアデータ関係が設定されています。
カテゴリ -> 製品 -> CartProduct <<- カート (下の図を参照)。
しかし、これらの関係を (コードで) 確立する方法を理解するのに苦労しています。私は、CartProduct+Product & Cart+CartProduct という名前の 2 つの Objective-C カテゴリを作成しました。
CartProduct+Product には次のコードが含まれています。ユーザーが「カートに追加」ボタンを押すと、このメソッドが呼び出されます。
+ (CartProduct *)addProductToCartProducts:(Product *)theProduct inManagedObjectContext:(NSManagedObjectContext *)context {
CartProduct *cartProduct = nil;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"CartProduct"];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"products" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *cartProducts = [context executeFetchRequest:request error:&error];
if (!cartProducts || ([cartProducts count] > 1)) {
// handle error
} else if (![cartProducts count]) {
cartProduct = [NSEntityDescription insertNewObjectForEntityForName:@"CartProduct"
inManagedObjectContext:context];
/*This method is called from an background context, to prevent context conflicting, get nsmangedobject by its id, which is threadSafe. */
NSManagedObjectID *retID = [theProduct objectID];
//Setup One-One relationship from Product to CartProduct
cartProduct.product = (Product *) [context objectWithID:retID];
/*Call method from class Cart+CartProduct to establish to-many relationship from Cart to CartProduct.*/
[Cart addCartProductToCart:cartProduct inManagedObjectContext:context];
} else {
cartProduct = [cartProducts lastObject];
}
return cartProduct;
}
Cart+CartProduct には次のコードが含まれています。
+ (Cart *)addCartProductToCart:(CartProduct *)theCartProduct inManagedObjectContext:(NSManagedObjectContext *)context {
Cart *cart = nil;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"CartProduct"];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"productsInCart" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *cartProducts = [context executeFetchRequest:request error:&error];
if (!cartProducts || ([cartProducts count] > 1)) {
// handle error
} else if (![cartProducts count]) {
cart = [NSEntityDescription insertNewObjectForEntityForName:@"Cart"
inManagedObjectContext:context];
[cart addProductsInCartObject:theCartProduct];
} else {
cart = [cartProducts lastObject];
}
return cart;
}
ここで、ユーザーがカートに追加したオブジェクトを表示したいので、カートエンティティからフェッチします。しかし、関係を正しく「接続」したかどうかわかりませんか? 商品を表示できるように、カート内の商品を取得する方法を説明します。(これは CartProduct と 1 対多の関係にあります)。
だから私の質問は:
確立された関係は正しいですか?
カートに追加された商品を取得するにはどうすればよいですか?
注: 今年の初めに、次の投稿を行いました:カート機能に追加 - コア データとこの質問はそれに基づいています。