已编辑的UITableViewCell存储为新单元格

时间:2013-12-30 17:22:17

标签: ios objective-c core-data

我有一个表视图,其数据源与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

1 个答案:

答案 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
    }
}