0

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

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

在此处输入图像描述

但是我很难弄清楚如何建立这些关系(在代码中)。我制作了 2 个 Objective-C 类别,名称为:CartProduct+Product 和 Cart+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; 

}

现在我想查看用户添加到他的购物车中的对象,因此我从购物车实体中获取。但我不知道我是否已经“连接”了这些关系是否正确?以及如何获取购物车中的产品,以便我可以展示产品。(与 Ca​​rtProduct 存在一对多关系)。

所以我的问题是:

  1. 建立的关系是否正确?

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

注意:今年早些时候,我发表了以下帖子:添加到购物车功能 - 核心数据,这个问题基于此。

4

1 回答 1

1

您的关系似乎大多正确,但我认为您甚至不需要 CartProduct 实体。Core Data 可以在幕后处理多对多关系。你可以让购物车有一个关系“产品”,而产品有一个反向关系“inCarts”。一个购物车可以有很多产品,一个产品可以在很多购物车中。

但无论如何,你可以保持原样。唯一的问题是产品的关系“cartProduct”应该是对多的(因此应该命名为“cartProducts”。也就是说,如果您希望产品有可能在多个购物车中。另外,请确保您正确定义所有反向关系。

你的代码在我看来都是错的。实现你想要做的事情太复杂了。Core Data 让它变得简单。看起来您正在尝试创建一个新的购物车并将产品添加到其中。你不应该需要做任何获取来做到这一点。似乎您正在像数据库一样思考。使用 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;
}

哈德文胸!

于 2013-05-31T16:30:47.267 回答