我可以创建一个核心数据对象而不保存它吗?
Can I create a Core Data object without saving it?
我正在制作一个应用程序,您可以在其中拥有多个日记本并且对每个日记本有不同的设置。我将 Journal
和 JournalSettings
数据存储在核心数据中。现在我想允许用户编辑默认日记设置,以便新的 Journal
具有默认日记设置所描述的 JournalSettings
。我使用 UserDefaults 来存储默认日志设置,因为它似乎是存储默认设置的合适位置。我已经有一个 JournalSettingsView
来显示一个 JournalSettings
对象,我想重新使用这个视图来显示和编辑默认的日记设置。所以我想从存储在 UserDefaults 中的默认日志设置数据创建一个 JournalSettings
实例,但我不想将这个新的 JournalSettings
实例保存到 Core Data,因为它只是数据的副本已存储在 UserDefaults 中。
我可以创建一个 Core Data 对象实例而不曾经将它保存到 Core Data 吗?我想我可以使用一个内存中的子 NSManagedObjectContext
来创建对应于默认日志设置的 JournalSettings
,但据我所知,该子上下文将保存到它的父上下文(我的主要核心数据上下文)。我还尝试创建一个单独的(不是子项)内存中 NSManagedObjectContext
来存储默认值 JournalSettings
,但随后我的应用程序崩溃并出现错误:
Multiple NSEntityDescriptions claim the NSManagedObject subclass 'JournalSettings' so +entity is unable to disambiguate.
如果我不能在不保存的情况下创建 Core Data 对象,我仍然可以通过几种方法实现默认的日志设置,但我不确定哪种方法是最佳实践:
- 将默认期刊设置移至 Core Data。这会很好用; UserDefaults 似乎更适合存储默认值。
- 创建新视图以 show/edit 默认日记设置,而不是重复使用
JournalSettingsView
。这也可行,但管理两个旨在显示同一事物的视图会有点烦人。视图之间唯一真正的区别是一个视图作为 JournalSettings
实例获取输入,而另一个视图将单独提供 JournalSettings
属性(如字体大小、期刊名称等)。
子上下文是您正在寻找的解决方案。
来自文档:
If a context’s parent store is another managed object context, fetch and save operations are mediated by the parent context instead of a coordinator. This pattern has a number of usage scenarios, including:
- Managing discardable edits, such as in an inspector window or view.
您说得对,当您保存子上下文时,数据更改将传播到父上下文。
在您的情况下,您根本不需要保存子上下文。
与您的其他想法相关的:
- 哪种存储最适合:UserDefault 或 CoreData。这取决于
JournalSettings
代表什么类型的设置。如果它是与数据相关的设置(如参考数据对象等),我会存储在 CD 中。但是,如果它是数据独立的一般设置,那么 UD 是更好的地方。并且不要忘记 UD 不能被系统清除/丢失。所以你不应该在其中存储敏感/重要数据。
- 也许您不需要创建新视图。相反,您可以在另一个实体(MVC 中的 Controller,MVVM 中的 ViewModel ...)中提取与数据相关的操作。在这种情况下,您将拥有独立于存储类型的单一视图。
对于Swift 5
如果使用主上下文,即使不保存,数据仍然是'in context'。所以如果想在不保存的情况下使用核心数据模型,你需要创建一个子上下文并在模型上下文中使用它。
let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
let dataModel = CoreDataEntityModel(context: childContext)
我正在制作一个应用程序,您可以在其中拥有多个日记本并且对每个日记本有不同的设置。我将 Journal
和 JournalSettings
数据存储在核心数据中。现在我想允许用户编辑默认日记设置,以便新的 Journal
具有默认日记设置所描述的 JournalSettings
。我使用 UserDefaults 来存储默认日志设置,因为它似乎是存储默认设置的合适位置。我已经有一个 JournalSettingsView
来显示一个 JournalSettings
对象,我想重新使用这个视图来显示和编辑默认的日记设置。所以我想从存储在 UserDefaults 中的默认日志设置数据创建一个 JournalSettings
实例,但我不想将这个新的 JournalSettings
实例保存到 Core Data,因为它只是数据的副本已存储在 UserDefaults 中。
我可以创建一个 Core Data 对象实例而不曾经将它保存到 Core Data 吗?我想我可以使用一个内存中的子 NSManagedObjectContext
来创建对应于默认日志设置的 JournalSettings
,但据我所知,该子上下文将保存到它的父上下文(我的主要核心数据上下文)。我还尝试创建一个单独的(不是子项)内存中 NSManagedObjectContext
来存储默认值 JournalSettings
,但随后我的应用程序崩溃并出现错误:
Multiple NSEntityDescriptions claim the NSManagedObject subclass 'JournalSettings' so +entity is unable to disambiguate.
如果我不能在不保存的情况下创建 Core Data 对象,我仍然可以通过几种方法实现默认的日志设置,但我不确定哪种方法是最佳实践:
- 将默认期刊设置移至 Core Data。这会很好用; UserDefaults 似乎更适合存储默认值。
- 创建新视图以 show/edit 默认日记设置,而不是重复使用
JournalSettingsView
。这也可行,但管理两个旨在显示同一事物的视图会有点烦人。视图之间唯一真正的区别是一个视图作为JournalSettings
实例获取输入,而另一个视图将单独提供JournalSettings
属性(如字体大小、期刊名称等)。
子上下文是您正在寻找的解决方案。
来自文档:
If a context’s parent store is another managed object context, fetch and save operations are mediated by the parent context instead of a coordinator. This pattern has a number of usage scenarios, including:
- Managing discardable edits, such as in an inspector window or view.
您说得对,当您保存子上下文时,数据更改将传播到父上下文。
在您的情况下,您根本不需要保存子上下文。
与您的其他想法相关的:
- 哪种存储最适合:UserDefault 或 CoreData。这取决于
JournalSettings
代表什么类型的设置。如果它是与数据相关的设置(如参考数据对象等),我会存储在 CD 中。但是,如果它是数据独立的一般设置,那么 UD 是更好的地方。并且不要忘记 UD 不能被系统清除/丢失。所以你不应该在其中存储敏感/重要数据。 - 也许您不需要创建新视图。相反,您可以在另一个实体(MVC 中的 Controller,MVVM 中的 ViewModel ...)中提取与数据相关的操作。在这种情况下,您将拥有独立于存储类型的单一视图。
对于Swift 5
如果使用主上下文,即使不保存,数据仍然是'in context'。所以如果想在不保存的情况下使用核心数据模型,你需要创建一个子上下文并在模型上下文中使用它。
let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
let dataModel = CoreDataEntityModel(context: childContext)