0

我目前为我的订购应用程序设置了以下关系。

产品 <<- 购物车

这是正常工作,产品被添加到购物车等等。当用户按下“购物车视图控制器”中的“订购按钮”时,我希望所有这些刚刚被订购的产品都显示在我的另一个视图控制器中。我想显示用户下的所有订单。但我真的不知道如何设置我的核心数据模型来完成这个?我需要购物车中的一对一关系还是一对多关系或完全不同的关系?

谢谢您的帮助。

编辑1:

在此处输入图像描述

编辑2:

+ (ProductOrder *)addProductToOrderWithProduct:(Product *)product inManagedObjectContext:(NSManagedObjectContext *)context {


    ProductOrder *orderProduct = nil;

    orderProduct = [NSEntityDescription insertNewObjectForEntityForName:@"ProductOrder"     inManagedObjectContext:context];



    NSManagedObjectID *productID = [product objectID];

    orderProduct.antal = product.antal;
    [(Product *)[context objectWithID:productID] addOrderedProductsObject:orderProduct];

    return orderProduct;

}

    + (Order *)addOrderedProductToOrderWithOrderedProduct:(ProductOrder *)orderedProduct inManagedObjectContext:(NSManagedObjectContext *)context {

    Order *order = nil;

      order = [NSEntityDescription insertNewObjectForEntityForName:@"Order" inManagedObjectContext:context];



// THIS SHOULD INCREMNT THE ATTRIBUTE FOR SECTIONS, WHEN A NEW ORDER IS CREATED. 

    NSNumber *number = [NSNumber numberWithInt:order.orderNumber.intValue];
                    int value = [number intValue];
                    number = [NSNumber numberWithInt:value + 1];

                    order.orderNumber =  [NSString stringWithFormat:@"Order %@", number.stringValue];

                    NSLog(@"%@", order.orderNumber );


        NSManagedObjectID *orderedProductID = [orderedProduct objectID];

        [order addOrderProductsObject:(ProductOrder *)[context objectWithID:orderedProductID]];




        return order; 


    }

从购物车中的产品添加产品到订单:

// 购物车产品

  for (Product *prod in [self.fetchedResultsController fetchedObjects]) {


        [[[DataManager sharedInstance] backgroundManagedObjectContext] performBlock:^{

       [Order addOrderedProductToOrderWithOrderedProduct:  [ProductOrder addProductToOrderWithProduct:prod inManagedObjectContext:[[DataManager sharedInstance] backgroundManagedObjectContext]] inManagedObjectContext:[[DataManager sharedInstance] backgroundManagedObjectContext]];


                         prod.antal = [NSNumber numberWithInt:0];

                        [self saveCurrentContext:_theManagedObjectContext];
                        [[DataManager sharedInstance] saveBackgroundContext];
                        [[DataManager sharedInstance] saveMasterContext];




        }];



    }

从传递的订单对象中加载“订单视图控制器”中的订单

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"ProductOrder"];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"inOrder.orderNumber" ascending:YES];
    [fetchRequest setSortDescriptors:@[sortDescriptor]];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_theManagedObjectContext sectionNameKeyPath:@"inOrder.orderNumber" cacheName:nil];
    _fetchedResultsController.delegate = self;



    NSError *error = nil;


    if (![_fetchedResultsController performFetch:&error]) {
        NSLog(@"Fetch Failed");

    }



}
4

1 回答 1

1

一个产品可以多次订购,一个订单包含多个产品,所以第一个想法是使用多对多关系:

Product <<-->> Order (1)

但是,如果您想使用获取的结果控制器显示所有订单及其产品,那么您需要插入一个“中间”实体:

 Product <->> ProductOrder <<-> Order (2)

原因是 FRC 只能显示每个对象一次,因此对于模型 (1),您无法显示属于多个订单的产品。使用模型 (2),您可以获取ProductOrder对象并按Order (使用sectionNameKeypath:参数)将它们分组到部分中。

于 2013-06-16T18:30:09.233 回答