2013-07-01 4 views
0

У меня есть следующие отношения в мое приложение:данных Приращение Основные приписывать

Продукт - >> ProductOrder < < - Заказать

я тогда два Obj-C категории для того, чтобы эти отношения etablish:

ProductOrder + Продукт

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

    ProductOrder *orderProduct = nil; 

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

    NSManagedObjectID *productID = [product objectID]; 

    orderProduct.qnty = product.qnty; 
    orderProduct.price = product.price; 

    [(Product *)[context objectWithID:productID] addOrderedProductsObject:orderProduct]; 

    return orderProduct; 

} 

А потом Заказ + ProductOrder

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

    Order *order = nil; 

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

    NSManagedObjectID *orderedProductID = [orderedProduct objectID]; 

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

    return order; 

} 

добавить продукцию в этих отношениях, как так:

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

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

        ProductOrder *prodOrder = [ProductOrder addProductToOrderWithProduct:prod inManagedObjectContext:[[DataManager sharedInstance] backgroundManagedObjectContext]]; 

        Order *order = [Order addOrderedProductToOrderWithOrderedProduct:prodOrder inManagedObjectContext:[[DataManager sharedInstance] backgroundManagedObjectContext]]; 

        NSInteger amount = [order.orderNumber integerValue]; 

        amount++; 

        order.orderNumber = [NSString stringWithFormat:@"Order %@", [NSNumber numberWithInteger:amount]]; 

        [[DataManager sharedInstance] saveBackgroundContext]; 
        [[DataManager sharedInstance] saveMasterContext]; 

       }]; 

} 

Теперь я хочу, чтобы сгруппировать эти продукты в заголовках. У меня есть этот атрибут orderNumber в моей сущности Order, я хочу увеличивать для каждой группы продуктов, добавленных в отношение. Как мне это удастся?

Визуальный пример:

enter image description here

ответ

1

Ваш код имеет ряд проблем.

Во-первых, есть ли конкретная причина, по которой вам нужен другой контекст управляемого объекта? Если нет, устраните эту часть. Помните, что вы можете получить доступ к контексту каждого управляемого объекта с

product.managedObjectContext; 

Во-вторых, вы используете ObjectIds, которые действительно необходимы, только если передавать объекты в зависимости от контекста. В вашем методе вы извлекаете ID от product, а затем вызываете objectWithID, чтобы вернуть его. Это не имеет никакого смысла.

В-третьих, вам нужно очень повод, чтобы иметь это лицо ProductOrder. Даже если вы не сказали нам, давайте предположим, что это необходимо, потому что вы хотите включить, скажем, разные количества для продуктов в заказе, а также номер заказа. Однако имя, которое вы выбрали, очень сбивает с толку. Назовем это Item.

Ваша схема должна выглядеть следующим образом:

Product <---->> Item <<------> Order 

Вы могли бы просто использовать базовые данные генерируются методы для добавления отношений и выбрасывайте категории.

Для вашего стола вы могли бы принести Order сущность и сообщить источник данных следующим образом:

// number of sections 
fetchedObjects.count; 

// title for section 
Order *order = fetchedObjects[section]; 
order.name; 

// number of rows in section 
Order *order = fetchedObjects[section]; 
order.items.count; 

// row data 
Order *order = fetchedObjects[section]; 
NSArray *items = [order.items sortedArrayUsingSortDescriptors: 
    @[[NSSortDescriptor sortDescriptorWithKey:@"sequenceNumber" ascending:YES]]]; 
Item *item = items[indexPath.row]; 
item.product.name; 
+0

Большое спасибо, что код будет отличаться, если я использую FRC? :) – 7c9d6b001a87e497d6b96fbd4c6fdf