我有一个表视图,其数据源与Core Data同步。但是,我遇到了问题。每当我编辑或删除一个tableview单元格,并重新加载视图时,我会看到在编辑之前存在的tableview单元格的副本。这里有一些代码可以让它更清晰。
当视图首次加载时,它会尝试从“SOModule”中获取具有one-to-many
关系的所有“SOCommands”。然后,它将其转换为“SOCommandTemp”,这样我就可以在不改变数据库的情况下使用它们。
_serverModuleCommands = [[NSMutableArray alloc]initWithArray:[self.serverModule.socommand allObjects]];
for(int i=0;i<[_serverModuleCommands count];i++)
{
SOCommandTemp* newTemp = [[SOCommandTemp alloc]init];
newTemp.commandName = ((SOCommand*)[_serverModuleCommands objectAtIndex:i]).commandName;
newTemp.sshCommand = ((SOCommand*)[_serverModuleCommands objectAtIndex:i]).sshCommand;
[_serverModuleCommands replaceObjectAtIndex:i withObject:newTemp];
}
然后,当我编辑单元格时,我会调用以下方法:
[_serverModuleCommands addObject:commandValues]; //commandValues is in the form of SOCommandTemp
[_serverModuleCommands replaceObjectAtIndex:_selectedCommandCell.row withObject:commandValues]; //_selectedCommandCell is an ivar that is cleared immediately after use
然后,在保存时,我将数组转换为SOCommand:
for(int j=0; j<[_serverModuleCommands count]; j++){
SOCommand* newCommand = [NSEntityDescription insertNewObjectForEntityForName:@"SOCommand" inManagedObjectContext:self.managedObjectContext];
newCommand.commandName = ((SOCommandTemp*)[_serverModuleCommands objectAtIndex:j]).commandName;
newCommand.sshCommand = ((SOCommandTemp*)[_serverModuleCommands objectAtIndex:j]).sshCommand;
newCommand.somodule = newModule;
}
但是,在调用之前,我想确保我只保存一个数组项,因为我添加并编辑了一个单元格,所以我这样做:
NSLog(@"Going to Save: %@",[_serverModuleCommands description]);
果然,我只得到1个数组项。然后,我保存它,并退出视图控制器。但是当第一行:
_serverModuleCommands = [[NSMutableArray alloc]initWithArray:[self.serverModule.socommand allObjects]];
再次调用,我的描述中有两个值,一个用于原始值,另一个用于编辑。
任何帮助都会很棒!
〜Carpetfizz
答案 0 :(得分:1)
在您的保存细分中,您可以创建一个新的SOCommand
对象,无论该对象是否已存在。
为什么不直接使用实际对象(SOCommand
)并对其进行编辑,在保存上下文之前,这不会改变您的数据库信息。
它会为你节省一些在你的物体之间来回交换的悲伤。
如果无法在上下文中进行编辑,则应将现有项objectID
传递给“temp”对象,如果存在,则从DB获取此对象并对现有项进行更新:
NSManagedObjectID* oID = ((SOCommandTemp*)[_serverModuleCommands objectAtIndex:j]).objectID;
if(oID) {
SOCommand* cmd = (SOCommand*)[context existingObjectWithID:oID error:nil];
if (cmd) { //no error fetching the object
//update `cmd` with your new values
}
}