核心数据:创建多个托管对象,但只保存一些?

Posted

技术标签:

【中文标题】核心数据:创建多个托管对象,但只保存一些?【英文标题】:Core Data: Create multiple managed objects, but only save some? 【发布时间】:2010-08-26 15:36:54 【问题描述】:

我正在尝试为我的应用程序编写一个收藏夹系统。我已经将我的模型转换为托管对象。想象一下,用户会看到一个包含这些对象列表的屏幕。他们可以选择将一些保存到他们的收藏夹中,这会将它们保存在核心数据中。

问题是,当我创建所有这些模型对象时,我是使用托管对象上下文来创建的。如果用户将单个实体保存到他们的收藏夹,它将保存整个上下文,并保留每个实体。临时演员不会在他们的收藏夹中,因为添加到收藏夹会构造一个“收藏夹”实体,该实体会被保存并指向其他人没有的对象。但是所有其他对象都将被不必要地保存。

设计 iPhone 收藏夹系统的标准方法/标准方法是什么?我是否应该将我的模型分为两类,一类是我向用户展示的,一类是保存到数据库的?这样我就可以在不将它们放入 MOC 的情况下构建我的模型。但这将是一个具有所有相同字段的重复类。

【问题讨论】:

【参考方案1】:

并没有真正的标准方法来执行此操作,因为 Core Data 期望您保存您创建的对象。但是,如果您使用以下命令创建对象:

id object = [[NSManagedObject alloc] initWithEntityDescription:entity inManagedObjectContext:nil];

他们没有上下文可以保存。那么对于那些你需要保存的,你可以:

[[self managedObjectContext] insertObject:object];

然后在上下文上调用-save:,只有那些已经设置了上下文的才会保存。

【讨论】:

这样安全吗?我看到构建 NSMO 的便捷方法替换了相当大的代码块。 是的,它是安全的,有什么方便的方法?我描述的方法和调用[NSEntityDescription insert...]一样。唯一的区别是NSEntityDescription 方法返回一个自动释放的对象。 好吧,你的第二件事倒退了。正确的调用是[[self managedObjectContext] addObject:object],你在那儿的相反是不存在的。 正确,在没有编译器的情况下从内存编码会产生这样的小错误:) 嗨@MarcusS.Zarra。我知道这是您的旧答案,但由于各种可能的问题(例如***.com/a/3868651),其他地方最近的讨论是避免使用 nil 上下文。有没有办法使用子上下文来实现这一点?我可以很容易地看到如何创建子上下文以生成结果,但保存它只会将所有内容转储回父级。是否可以使用相同的 insertObject 方法将特定的“收藏夹”从子级移动到父级,并保留其余的?【参考方案2】:

在您的托管对象上拥有一个 isFavorite 属性不是更容易吗?然后在您的收藏夹视图中,您可以根据它进行过滤吗?

【讨论】:

但这仍然无法解决我正在保存大量不需要的数据这一事实。

以上是关于核心数据:创建多个托管对象,但只保存一些?的主要内容,如果未能解决你的问题,请参考以下文章

设备密码锁定时无法保存核心数据托管对象上下文

核心数据和托管对象上下文

核心数据:父/子托管对象上下文是不是适合更新一组多个对象?

核心数据:托管对象与上下文一起保存后如何撤消操作

ios/objective-c:保存核心数据时出错

在核心数据中保存到托管对象上下文时的 SIGABRT