背景:
流程逻辑:输入项目编号后,在项目下查找。如果找到,请创建相应的 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?如何避免呢?
提前致谢。
答案 0 :(得分:1)
如果找到,请创建相应的truckItem托管对象并将其保存在字典中
“相应的”truckItem对象只能是使用相应的item
对象填充Items
关系的对象。由于您具有一对一的关系,因此会从您拥有的任何其他item
对象中删除truckItem
值。
添加数量,销毁新创建的truckItem。
然后,将具有有效关系的唯一truckItem
对象删除回项目。
您没有显示truckItem
所在的代码,但由于您正在搜索Items
,因此只需使用该项的onTruck
属性 - 这将是零,如果它不在卡车上,或者如果是卡车物品对象。此时,创建新项目或更新数量。