核心数据关系 - 购物车

时间:2013-05-31 13:52:14

标签: ios objective-c core-data sdk

我在模型中设置了以下核心数据关系。

类别 - >产品 - > CartProduct<< - 购物车(见下图)。

enter image description here

但我很难弄清楚如何建立这些关系(在代码中)。我制作了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有一对多的关系)。

所以我的问题是:

  1. 这种关系是否正确?

  2. 如何设法获取添加到购物车中的产品?

  3. 注意:今年早些时候,我发了以下帖子:Add to cart functionality - Core data,这个问题就是基于此。

1 个答案:

答案 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!