【问题标题】:Core data relationships - Cart核心数据关系 - 购物车
【发布时间】:2013-05-31 13:52:14
【问题描述】:

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

类别 -> 产品 -> 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. 如何获取添加到购物车的产品?

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

【问题讨论】:

    标签: ios objective-c core-data sdk


    【解决方案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;
    }
    

    戴上胸罩!

    【讨论】:

    • 非常感谢您的回答:)。我已经考虑过了,我同意 CartProduct 实体没有必要,它现在被删除了。我现在拥有 Product 和 Cart 实体,它具有从 Product 到 Cart 的一对多关系(Product (inCart)
    • 我可以使用 Cart *cart; 从 Cart 实体中获取产品吗?带有 FRC 的 cart.products.navn 或者我将如何使用上面的代码和新关系来处理 NSSet? :) 非常感谢/Mange tak :)
    • 我很难理解您更改的模型和评论表单中的其他问题。请在上面添加另一个问题或编辑您的问题,以便您提供格式正确的代码。带有新模型图表的新图像也会有所帮助。
    • 非常感谢您的帮助。我在这里添加了另一个问题:stackoverflow.com/questions/16884746/… 我的新模型,谢谢。
    • 好的,我会回答另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多