coredata关系自动设置为nil

时间:2013-05-03 07:32:52

标签: ios core-data

我有两个实体。 (交易,客户) 交易与客户有1:1的关系。所以Deal有客户,而客户有交易。

首先,我将Customer对象命名为“John”。 第二,我做了Deal对象并用“John”设置客户(#1交易) 第三,我制作了另一个Deal对象并用“John”(#2交易)

设置客户 那时候,我发现了一些问题。 这是#1交易的客户自动设置为零,而#2交易的客户是“约翰”。

我该如何解决?

PS1。我从Web服务器获得的数据就是这样的JSON    deals = [id:..,...,customer:{...}]

PS2。每当从服务器接收数据时我都会更新对象。

+ (Deal *)dealWithDealsDictionary:(NSDictionary *)dic inManagedObjectContext:(NSManagedObjectContext *)context
{
    Deal *deal = nil;

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Deal"];
    request.predicate = [NSPredicate predicateWithFormat:@"deal_id = %@", [dic[@"id"] description]];

    // Execute the fetch

    NSError *error = nil;
    NSArray *matches = [context executeFetchRequest:request error:&error];

    // Check what happened in the fetch

    if (!matches || ([matches count] > 1)) {  // nil means fetch failed; more than one impossible (unique!)
        deal = [matches lastObject];
        // handle error
    } else if (![matches count]) {
        deal = [NSEntityDescription insertNewObjectForEntityForName:@"Deal" inManagedObjectContext:context];
    } else {
        deal = [matches lastObject];
    }

    deal.deal_id = [dic[@"id"] description];
    deal.deal_status = [dic[@"deal_status"] description];
    deal.deal_stage = [dic[@"deal_stage"] description];
    deal.deal_desc = [dic[@"deal_desc"] description];
    deal.localized_deal_status = [dic[@"localized_deal_status"] description];
    deal.localized_deal_stage = [dic[@"localized_deal_stage"] description];

    if (dic[@"customer"]) {
        [context performBlock:^{
            deal.customer = [Customer customerWithDictionary:dic[@"customer"] inManagedObjectContext:context];
        }];
    }

    return deal;
}

2 个答案:

答案 0 :(得分:2)

如果您希望客户有很多交易和/或每个客户都有很多交易(客户可以分别拥有相同的交易),那么将关系设为1对多或多对多。

引用设置为nil,因为你说一次只能有1个引用。

答案 1 :(得分:2)

你没有1:1的关系:它是1:N

2笔交易拥有相同的客户,因此1位客户有N笔交易。

CoreData希望保持1:1约束,其中1个交易总是1个唯一客户,反之亦然。

更改为一对多