Ios 编辑/添加具有相同视图的核心数据实体?

Ios 编辑/添加具有相同视图的核心数据实体?,ios,core-data,Ios,Core Data,首先,让我解释一下我想要实现的目标。我有一个带有MasterViewController和EditViewController的主细节应用程序。MasterViewController包含一个添加按钮和一个列出核心数据实体的表。当用户点击表格行或“添加”按钮时,应弹出“编辑”视图。我对我应该如何以不同的方式处理编辑和添加感到困惑 我现在是这样做的:我的应用程序使用故事板,所以我有editEntity和addEntity从主程序到编辑的顺序。这两个序列都将实体传递给EditViewControll

首先,让我解释一下我想要实现的目标。我有一个带有MasterViewController和EditViewController的主细节应用程序。MasterViewController包含一个添加按钮和一个列出核心数据实体的表。当用户点击表格行或“添加”按钮时,应弹出“编辑”视图。我对我应该如何以不同的方式处理编辑和添加感到困惑

我现在是这样做的:我的应用程序使用故事板,所以我有
editEntity
addEntity
从主程序到编辑的顺序。这两个序列都将实体传递给EditViewController,但
editEntity
根据点击的行查找现有实体,而
addEntity
创建一个新实体。这两个序列都在实体上设置了
isNew
瞬态属性

EditViewController对核心数据一无所知——它只是编辑给定的实体。它依次有
完成
取消
展开操作。MasterViewController在考虑取消时会查看
isNew
属性——如果实体是新的,它会删除它,如果它已经存在,它不会应用更改


这是可行的,但有几个问题。首先,向实体添加额外属性似乎有点混乱。其次,如果用户在编辑新实体时关闭编辑视图上的应用程序,该实体将不会被删除,这当然是意外的。最重要的是,这似乎是一个核心数据本身必须解决的问题——我只是不知道如何解决。非常感谢

最简单的改进是将实体描述上的
isNew
标志替换为编辑视图控制器上的标志。编辑VC可能不知道有关核心数据的任何信息,但可以让它知道它正在编辑的对象是新的还是预先存在的。在那里设置标志,并让主VC在决定如何继续之前检查该值。不要把它放在实体描述中,它不是你需要保留的数据

在这种情况下,我所做的是创建新实例,但不要将其插入托管对象上下文中。差不多

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:[self managedObjectContext]];
NSManagedObject *myObj = [[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil];
创建实例时,将第二个参数的
nil
传递给您一个尚未插入的实例。将其传递给“编辑视图”控制器

如果用户点击save(保存)按钮,您可以在以后插入它,如下所示:

if ([myObj managedObjectContext] == nil) {
    [[self managedObjectContext] insertObject:myObj];
}
由于对象尚未插入,因此它没有托管对象上下文,因此检查该属性会告诉您是否要插入它。不要在此处使用
isInserted
属性,它不会满足您的需要。在这两种情况下都保存更改


如果用户点击“取消”,就不要插入它。该对象与任何其他对象一样被解除分配,并且永远不会进入持久存储。因为您从未插入过它,所以不必费心删除它。

那太酷了!我偶然发现了另一个解决方案:
done
calls[[self-managedObjectContext]save]和
cancel
calls[[self-managedObjectContext]rollback]。从我有限的测试,这似乎是工作!你认为这种方法比你的有什么优势吗?再次感谢你的回答!这取决于应用程序中正在发生的其他情况、托管对象上下文是否在任何其他位置使用,特别是上下文上是否存在任何其他未保存的更改。使用
rollback
放弃所有未保存的更改。如果在您的情况下看起来安全,这是一个好主意,否则不要冒失去更改的风险。