核心数据:fetchedResultsController关系“神奇地”设置为nil

时间:2013-03-13 05:40:31

标签: objective-c core-data

背景:

  • 我正在使用库存管理应用程序。
  • 用户可以向卡车添加库存
  • 添加已经在卡车上的物品时,我只想更新其数量,而不是再次添加。
  • 这是一对一的关系。现在只有一辆“卡车” Image Description Here

流程逻辑:输入项目编号后,在项目下查找。如果找到,请创建相应的 truckItem 托管对象并将其保存在字典中。一旦我准备好保存对存储的所有 truckInventory 对象的上下文检查。如果该项目已存在,则获取 truckItem 托管对象,并添加数量,销毁新创建的 truckItem 。保存。

问题:检查存储的truckItems时,它会加载所有信息,但项目将设置为nil。 (注意,是零,不是)。因此,数量反映了正确的价值,但我们不再拥有适当的项目。

简化代码: 装货库存:

NSError *error;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"TruckItems"];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"item" ascending:YES];

[request setSortDescriptors:[NSArray arrayWithObject:sort]];

loadedInventoryResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self->context sectionNameKeyPath:nil cacheName:nil];

if(![loadedInventoryResultsController performFetch:&error]) {
      NSLog(@"Error! %@", [error localizedDescription]);
}

检查已保存的库存简化代码:

for(NSString *mpn in items) {

    TruckItems *item = [items objectForKey:mpn];

    //This shows the right number of managedObjects, but the ones that are repeated show item = nil;
    NSLog(@"Logged: %@", [loadedInventoryResultsController fetchedObjects]);

    //Check to see if items are already in inventory. If they are update their quantities rather than adding them again.
    for(TruckItems *loadedItem in [loadedInventoryResultsController fetchedObjects]) {

        Items *storedItem = [loadedItem item]; //I am doing this just for testing: This comes back as nil. This is the problem as it comes nil
        Items *scanned = [item item];  //Same here.

                if([stored.manufacturerProductNumber isEqualToString:scanned.manufacturerProductNumber]) {

                    item.quantity = [loadedItem.quantity decimalNumberByAdding:item.quantity];

                    [context deleteObject:loadedItem];
                }
            }
        }
//Save context

问题:为什么设置为nil?如何避免呢?

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

如果找到,请创建相应的truckItem托管对象并将其保存在字典中

“相应的”truckItem对象只能是使用相应的item对象填充Items关系的对象。由于您具有一对一的关系,因此会从您拥有的任何其他item对象中删除truckItem值。

  

添加数量,销毁新创建的truckItem。

然后,将具有有效关系的唯一truckItem对象删除回项目。

您没有显示truckItem所在的代码,但由于您正在搜索Items,因此只需使用该项的onTruck属性 - 这将是零,如果它不在卡车上,或者如果是卡车物品对象。此时,创建新项目或更新数量。