在订购应用程序中设置核心数据关系

时间:2013-06-16 15:41:24

标签: ios objective-c core-data

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

产品<< - 购物车

这样可以正常工作,产品会被添加到购物车中,依此类推。当用户按下“购物车视图控制器”中的“订购按钮”时,我希望所有这些产品在我的其他视图控制器中被命令显示。我想显示用户发出的所有订单。但我无法弄清楚如何设置我的核心数据模型来实现这一目标?我是否需要从购物车中获得一对一的关系或一对多的关系或完全不同的东西?

感谢您的帮助。

编辑1:

enter image description here

编辑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];




        }];



    }

从传递的订单对象

加载“order viewcontroller”中的订单
    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");

    }



}

1 个答案:

答案 0 :(得分:1)

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

Product <<-->> Order (1)

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

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

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