【问题标题】:Can I create a Core Data object without saving it?我可以在不保存的情况下创建 Core Data 对象吗?
【发布时间】:2021-11-21 16:24:39
【问题描述】:

我正在制作一个应用程序,您可以在其中拥有多个期刊并为每个期刊设置不同的设置。我将JournalJournalSettings 数据存储在Core Data 中。现在我想允许用户编辑默认日志设置,以便新的Journals 具有默认日志设置所描述的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 对象,我仍然可以通过几种方法实现默认日志设置,但我不确定哪种方法是最佳做法:

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

【问题讨论】:

  • 我完全不明白您为什么需要 Core Data 来进行 JournalSettings,在我看来这是一个过于复杂的解决方案。

标签: ios swift core-data


【解决方案1】:

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

来自文档:

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

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

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

与您的其他想法有关:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多