【问题标题】:Editing/Adding a Core Data entity with the same view?编辑/添加具有相同视图的核心数据实体?
【发布时间】:2013-06-20 07:33:03
【问题描述】:

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

这是我目前的做法:我的应用程序使用 Storyboards,所以我有 editEntityaddEntity 从 Master 到 Edit。两个 segue 都将一个实体传递给 EditViewController,但 editEntity 根据所点击的行找到一个现有实体,而 addEntity 创建一个新实体。两个 segue 都在实体上设置了 isNew 瞬态属性。

EditViewController 对 Core Data 一无所知——它只是编辑它给定的实体。它又具有donecancel 展开操作。 MasterViewController 在考虑cancel 时会查看isNew 属性——如果实体是新的,它会删除它,如果它已经存在,它根本不应用更改。

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

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

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

    我在这种情况下所做的是创建新实例,但还没有将它插入到托管对象上下文中。类似的东西

    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:[self managedObjectContext]];
    NSManagedObject *myObj = [[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil];
    

    在创建实例时为第二个参数传递nil 会为您提供一个尚未插入的实例。将其传递给编辑视图控制器。

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

    if ([myObj managedObjectContext] == nil) {
        [[self managedObjectContext] insertObject:myObj];
    }
    

    由于该对象尚未插入,它没有托管对象上下文,因此检查该属性会告诉您是否插入它。 不要在此处使用isInserted 属性,它不会满足您的需要。在任何一种情况下都保存更改。

    如果用户点击“取消”,请不要插入它。该对象像任何其他对象一样被释放,并且永远不会进入持久存储。由于您从未插入过它,因此您无需费心将其删除。

    【讨论】:

    • 太酷了!我偶然发现了另一个解决方案:done 调用 [[self managedObjectContext] save] 和 cancel 调用 [[self managedObjectContext] rollback]。从我有限的测试来看,这似乎有效!您认为这种方法比您的方法有什么优势吗?再次感谢您的回答!
    • 这取决于您的应用程序中发生的其他事情,托管对象上下文是否在任何其他地方使用,特别是上下文是否可能存在任何其他未保存的更改。使用rollback 会丢弃所有未保存的更改。如果在您的情况下看起来安全,这是个好主意,否则不要冒险丢失更改。
    猜你喜欢
    • 2021-12-04
    • 2020-11-23
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2021-10-31
    相关资源
    最近更新 更多