1

我在核心数据中有两个表,例如表 TA 和表 TB,TA 与 TB 具有一对多的关系。TA 中有一条记录 A1,我希望 TB 中有几条记录(B1,B2,..)映射到 for 循环中的 A1。在第一次迭代中,我查询 db 并获取 A1,调用 addTBObject:B1 并且没有保存上下文。在下一次迭代中,再次查询以获取 A1,但它返回 nil。(这么奇怪...)

如果我在第一次迭代中保存上下文,那么在下一次迭代中再次获得 A1 就可以了。但我不认为这是一种更好的做法,这会导致在一个 for 循环中执行许多保存操作。

有人可以帮忙吗?对此表示赞赏!

代码提取:

NSString* objBId = @"xxx";
for (int i=0; i< [dataArray count]; i++) {
    ObjA obj = [dataArray objectAtIndex:i];
    NSManagedObject* moObjA = [self getManagedObjAById:obj.objId inContext:context];
    if(moObjA)
    {
        NSManagedObject* moObjB = [self getManagedObjBById:objBId inContext:context];
        if (moObjB != nil)
        {
            [moObjB addAObject:moObjA];
            [self saveDB:context]; //if don't save here, moObjB will be nil in the next iteration...
        }
    }
}
4

1 回答 1

0

似乎找到了解决这个问题的线索。在getManagedObjBById的实现中,每次都会发起NSFetchRequest,如果每次迭代都没有commit,则在下一次迭代中获取请求将返回nil。

在我将代码更改为使用 [NSFetchRequest fetchRequestWithEntityName:@"TabelB"] 后,一切就绪!for循环在每次迭代中总能得到托管对象B,无需再保存。

进一步看,这是否意味着某个实体的 NSFetchRequest 只能在提交之前初始化一次(一个事务)?

源代码:

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"xxx" inManagedObjectContext:context]];

现在:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"xxx"];
于 2013-04-16T06:08:45.510 回答