核心数据更新尝试显示在表视图中但不持久

时间:2013-12-27 06:20:54

标签: ios objective-c core-data

我有一个使用UItableview和一个UIViewController的应用程序。 UIViewController用于添加/修改/查看

的所有内容

我可以添加和查看然后切换到编辑。 The problem I am having is persisting the data in core data following an update.在编辑/更新之后,更改在表视图中可见,但在应用程序重新启动时(或从那时返回到表视图),更改已消失。

tableview类在NSManagedObject中设置prepareForSegue,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIButton *)sender
{
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    NSManagedObject *selectedEntry = [fetchResultsArray objectAtIndex:indexPath.row];
    DSAdd *wadd = [segue destinationViewController];
    if ([segue.identifier  isEqualToString: @"detailsSegue"])
    {
        wadd.callType = 2; //view details
        wadd.selectedEntry = selectedEntry;
    }
    else
    {
        wadd.callType = 0; //add
    }
}

在视图控制器的标题中,我声明:

@property (strong) NSManagedObject *selectedEntry;

在视图控制器的类中,我有以下Save方法:

- (void) saveData
{
    DBUtils *dbu = [[DBUtils alloc] init];
    NSManagedObjectContext *context = [dbu managedObjectContext];
    if (isEditMode) //<-- THIS PART DOES NOT WORK
    {
        NSLog(@"%@",[_selectedEntry valueForKey:@"name"]); //prints old value
        [_selectedEntry setValue:_nameTF.text forKey:@"name"];
        NSLog(@"%@",[_selectedEntry valueForKey:@"name"]); //prints new value
    }
    else // <-- THIS PART WORKS
    {
        NSManagedObject *newItem;
         newItem = [NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:context];

       [newItem setValue:[NSNumber numberWithInt:1] forKey:@"catId"];
       [newItem setValue:_nameTF.text forKey:@"name"];
    } //else

    NSError *error;
    if (![context save:&error]) {
         NSLog(@"Failed to save - error: %@", [error localizedDescription]);
    }
    [self.navigationController popViewControllerAnimated:YES];
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

首先,您需要确保您使用的NSManagedObject属于您尝试保存的上下文。

然后,您需要检查此上下文的配置方式。如果它配置了持久性存储协调器,则save将提交到存储。如果配置了父上下文,则save会将更改推送到父级而不是保存到存储。在这种情况下,您需要保存父级,如果它配置了另一个父级,则保存该父级。当最后一个父节点(使用持久性存储协调器配置的节点)被保存时,更改将转到存储。

答案 1 :(得分:0)

我认为您的上下文可能存在问题,请尝试多线程

Try this