首页 > 解决方案 > 我可以在不保存的情况下创建 Core Data 对象吗?

问题描述

我正在制作一个应用程序,您可以在其中拥有多个期刊并为每个期刊设置不同的设置。我将JournalandJournalSettings数据存储在 Core Data 中。现在我想允许用户编辑默认日志设置,以便 newJournal具有JournalSettings默认日志设置所描述的内容。我使用 UserDefaults 来存储默认日志设置,因为它似乎是存储默认值的合适位置。我已经有一个JournalSettingsView要显示的JournalSettings对象,我想重用此视图来显示和编辑默认日记帐设置。所以我想JournalSettings从存储在 UserDefaults 中的默认日志设置数据创建一个实例,但我不想保存这个新的JournalSettingsCore Data 的实例,因为它只是已经存储在 UserDefaults 中的数据的副本。

我可以在不将其保存到 Core Data 的情况下创建一个 Core Data 对象实例?我想我可能可以使用一个内存中的孩子NSManagedObjectContext,我将在其中创建JournalSettings与默认日记设置相对应的内容,但据我了解,该子上下文将保存到其父上下文(我的主要核心数据上下文)。我还尝试在内存中创建一个单独的(不是子项)NSManagedObjectContext来存储 default JournalSettings,但随后我的应用程序因错误而崩溃:

Multiple NSEntityDescriptions claim the NSManagedObject subclass 'JournalSettings' so +entity is unable to disambiguate.

如果我无法在不保存的情况下创建 Core Data 对象,我仍然可以通过几种方法实现默认日志设置,但我不确定哪种方法是最佳实践:

  1. 将默认日志设置移动到 Core Data中。这会很好用;UserDefaults 似乎是一个更适合存储默认值的地方。
  2. 创建一个新视图以显示/编辑默认日志设置,而不是重复使用JournalSettingsView. 这也可以,但是管理两个旨在显示同一事物的视图会有点烦人。视图之间唯一真正的区别是,一个将其输入作为一个JournalSettings实例,而另一个将单独提供JournalSettings属性(如字体大小、期刊名称等)。

标签: iosswiftcore-data

解决方案


子上下文是您正在寻找的解决方案。

从文档:

如果上下文的父存储是另一个托管对象上下文,则获取和保存操作由父上下文而不是协调器进行调解。这种模式有很多使用场景,包括:

  • 管理可丢弃的编辑,例如在检查器窗口或视图中。

您是对的,当您保存子上下文数据更改将传播到父上下文时。
在您的情况下,您根本不需要保存子上下文。

与您的其他想法相关:

  1. 哪种存储最适合:UserDefault 或 CoreData。这取决于设置JournalSettings代表的类型。如果是与数据相关的设置(如参考数据对象等),我会将其存储在 CD 中。但是,如果是数据独立的常规设置,则比 UD 更好。并且不要忘记UD不能被系统清除/丢失。因此,您永远不应该在其中存储敏感/重要数据。
  2. 也许您不需要创建新视图。相反,您可以在另一个实体中提取与数据相关的操作(MVC 中的控制器,MVVM 中的 ViewModel ......)。在这种情况下,您将拥有独立于存储类型的单一视图。

推荐阅读