我在模型中设置了以下核心数据关系。
类别 - >产品 - > CartProduct<< - 购物车(见下图)。
但我很难弄清楚如何建立这些关系(在代码中)。我制作了2个Objective-C类别,名称为:CartProduct + Product&车+ CartProduct。
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;
}
现在我想查看用户添加到购物车的对象,因此我从Cart实体中获取。但我无法弄清楚我是否“正确连接”了这种关系?以及如何在购物车中获取产品,以便我可以展示产品。 (与CartProduct有一对多的关系)。
所以我的问题是:
这种关系是否正确?
如何设法获取添加到购物车中的产品?
注意:今年早些时候,我发了以下帖子:Add to cart functionality - Core data,这个问题就是基于此。
答案 0 :(得分:1)
您的关系似乎大多正确,但我认为您甚至不需要CartProduct实体。核心数据可以在幕后处理多对多关系。你可以让Cart有一个关系“产品”和Product有反向关系“inCarts”。购物车可以有许多产品,而产品可以放在许多购物车中。
但无论如何,你可以保持原样。唯一的问题是产品的关系“cartProduct”应该是多个(因此应该命名为“cartProducts”。也就是说,如果你希望产品可能在多个购物车中。还要确保你正确定义所有反向关系。
你的代码对我来说都是错的。这对于实现你想要做的事情来说太复杂了。核心数据使其变得简单。看起来您正在尝试创建新购物车并将产品添加到其中。你不需要做任何提取来做到这一点。看起来好像你在想数据库。使用Core Data,您不考虑修改表,而是考虑在对象之间设置指针。我会这样做:
+ (Cart *)startNewCartWithProduct:(Product *)product inManagedObjectContext:(NSManagedObjectContext *)context {
Cart *cart = [NSEntityDescription insertNewObjectForEntityForName:@"Cart" inManagedObjectContext:context];
CartProduct *cartProduct = [NSEntityDescription insertNewObjectForEntityForName:@"CartProduct" inManagedObjectContext:context];
// with correct inverse relationships, automatically adds cartProduct to cart:
cartProduct.cart = cart;
cartProduct.product = product;
return cart;
}
现在回答你的问题#2。要将产品放入购物车,请使用以下代码:
+ (NSSet *)productsInCart:(Cart *)cart {
NSMutableSet *result = [NSMutableSet setWithCapacity:[cart.productsInCart size]];
for (CartProduct *cartProduct in cart.productsInCart)
[result addObject:cartProduct.product];
return result;
}
Ha det bra!