Cocoa:如何避免核心数据重复关系?

Posted

技术标签:

【中文标题】Cocoa:如何避免核心数据重复关系?【英文标题】:Cocoa: How to avoid core-data duplicated relationships? 【发布时间】:2012-05-10 13:55:57 【问题描述】:

我有这些实体:

产品实体 姓名 订单 [ProductsOrderRelationship] 订单实体 产品 [ProductsOrderRelationship] 产品订单关系 订单 [OrderEntity] 产品 [ProductsEntity] 数量

现在,我想编辑现有订单。我有一个可用产品列表和购物车。

现在我想将这些可用产品添加到购物车。

代码必须检查产品是否存在,所以它只会增加数量。

但是,到现在为止,它只是添加更多的关系..

让我分享一段代码! 该界面左侧有一个列表,其中包含可用产品,右侧有一个列表,其中包含购物车(订单实体)。两者都有链接到我的代码的数组控制器。然后我有这个动作:

- (IBAction)addSelectedProducts:(id)sender 

    NSArray *firstSelectedProducts = [availableProductsController selectedObjects];
    //Objects selected in the array controller
    NSMutableArray *selectedProducts = [[NSMutableArray alloc] initWithCapacity:1];
    //Here I will filter the repeated ones
    NSMutableSet *newProducts = [NSMutableSet set];
    //This is the final value to change in the current order entry.
    NSMutableSet *oldProducts = [orderManagedObject valueForKey:@"products"];
    //This is the old value I will change.

    //Here we filter every repeated entries:
    if ( [firstSelectedProducts count] > 0 ) 
        for (id object in firstSelectedProducts) 
            if (![oldProducts containsObject:object]) 
                [selectedProducts addObject:object];
            
        
    

    //Here we create objects in the relationship entity:
    for (int i = 0; i < [selectedProducts count]; i++) 

        // Create new relationship.

        NSManagedObject *newProductObject = [
            NSEntityDescription
                insertNewObjectForEntityForName:@"ProductsOrderRelationship"
                         inManagedObjectContext:managedObjectContext
        ];

        [newProductObject setValue:[selectedProducts objectAtIndex:i] forKey:@"product"];
        [newProductObject setValue:orderManagedObject forKey:@"order"];

        [newProducts addObject:newProductObject];

        [newProductObject release];

    

    [newProducts unionSet:oldProducts];
    //Join old products and new products.
    [orderManagedObject setValue:newProducts forKey:@"products"];
    //Re-set the value.

    //(... release stuff here)

我找不到这个特定问题的指南。有什么建议吗?

【问题讨论】:

避免重复关系或重复输入数据? 【参考方案1】:

我猜firstSelectedProducts 包含 ProductsEntity 对象,oldProducts 包含 ProductsOrderRelationship 对象。如果这是真的,那么问题是......

if (![oldProducts containsObject:object]) 

...永远不会匹配任何东西。

(您所说的 ProductsOrderRelationship 通常称为 LineItem。更改类及其关联变量的名称可能会使逻辑更清晰。)

【讨论】:

谢谢!我做了一个更好的检查。

以上是关于Cocoa:如何避免核心数据重复关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在核心数据中使用唯一键重复插入?

从 tableView 上的核心数据填充数据时如何避免行重复

从弹出按钮插入 Cocoa 核心数据项目关系

Cocoa – 核心数据对象图

Cocoa-Touch – 更新多对多关系的核心数据

通过 sqlalchemy 关系添加值时如何避免插入重复条目?