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

Posted

技术标签:

【中文标题】在订购应用程序中设置核心数据关系【英文标题】:Setup Core Data relationship in ordering app 【发布时间】:2013-06-16 15:41:23 【问题描述】:

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

产品

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

感谢您的帮助。

编辑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");

    




【问题讨论】:

你能再解释一下吗?从您之前的问题中,我知道您已经有一个显示购物车中所有产品的获取结果控制器。这与“用户下的所有订单”有何不同? 当然,我有带有 3 个标签的标签栏,一个用于显示产品,然后是购物车,我有一个订单按钮和这个视图控制器,用于显示用户订购的产品。当按下购物车中的订单按钮时​​,购物车中的所有产品都会发送到服务器 - 发送订单,然后我想将产品从购物车移动/显示到我的另一个视图控制器,以显示所有产品被订购/发送到服务器进行处理。 我曾经想过建立这样的关系:Product 不同的是,产品在购物车中时尚未订购,首先是在按下订购按钮时:)。 您可以使用“产品 【参考方案1】:

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

Product <<-->> Order (1)

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

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

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

【讨论】:

为了将订单分组,我是否需要向“订单”实体添加一个属性,然后在“sectionNameKeypath:”中使用该属性?当我通过关系从 ProductOrder 实体中获取时,我将如何设法在表格视图中显示产品?非常感谢您的帮助:)(如果我用这个打开一个新问题而不是写在 cmets 中会更好吗?)。 @Seya:到目前为止听起来是正确的。不要忘记添加与 sectionNameKeyPath 使用相同属性的第一个排序描述符。 好的,很好:),但我无法让它工作。我在上面的“EDIT 2”下提供了我当前的代码。我已经创建了 2 个objective-c 类别来创建从 Product 到 ProductOrder 再到 Order 的关系。然后我得到购物车中的所有产品并将它们添加到关系中,然后将我从中获得的订单对象传递给我的“订单视图控制器”。我获取 ProductOrder 对象并尝试设置这些部分。但是购物车中的所有对象中只有一个对象被添加到关系中,并且只有一个对象只显示在 tableview 中。 我似乎找不到错误(也许我所做的类别有问题?)。再次感谢您的帮助。 您在获取的结果控制器中的谓词[NSPredicate predicateWithFormat:@"inOrder = %@", self.order]; 将结果集限制为一个顺序。也许您想删除该谓词?

以上是关于在订购应用程序中设置核心数据关系的主要内容,如果未能解决你的问题,请参考以下文章

swift中的核心数据关系

如何在 CoreData 的代码中设置 NSManagedObject 与另一个 NSManagedObject 或它们的堆栈的关系?

Confluence 6 外部小工具在其他应用中设置可信关系

如何在 coredata 中设置日期和时间间隔的谓词

核心 5,PasswordSignInAsync 无法在双重身份验证方案中设置 cookie

在 App Delegate 中设置 Init VC?