ios - 我可以在不保存的情况下创建 Core Data 对象吗?
问题描述
我正在制作一个应用程序,您可以在其中拥有多个期刊并为每个期刊设置不同的设置。我将Journal
andJournalSettings
数据存储在 Core Data 中。现在我想允许用户编辑默认日志设置,以便 newJournal
具有JournalSettings
默认日志设置所描述的内容。我使用 UserDefaults 来存储默认日志设置,因为它似乎是存储默认值的合适位置。我已经有一个JournalSettingsView
要显示的JournalSettings
对象,我想重用此视图来显示和编辑默认日记帐设置。所以我想JournalSettings
从存储在 UserDefaults 中的默认日志设置数据创建一个实例,但我不想保存这个新的JournalSettings
Core 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 对象,我仍然可以通过几种方法实现默认日志设置,但我不确定哪种方法是最佳实践:
- 将默认日志设置移动到 Core Data中。这会很好用;UserDefaults 似乎是一个更适合存储默认值的地方。
- 创建一个新视图以显示/编辑默认日志设置,而不是重复使用
JournalSettingsView
. 这也可以,但是管理两个旨在显示同一事物的视图会有点烦人。视图之间唯一真正的区别是,一个将其输入作为一个JournalSettings
实例,而另一个将单独提供JournalSettings
属性(如字体大小、期刊名称等)。
解决方案
子上下文是您正在寻找的解决方案。
从文档:
如果上下文的父存储是另一个托管对象上下文,则获取和保存操作由父上下文而不是协调器进行调解。这种模式有很多使用场景,包括:
- 管理可丢弃的编辑,例如在检查器窗口或视图中。
您是对的,当您保存子上下文数据更改将传播到父上下文时。
在您的情况下,您根本不需要保存子上下文。
与您的其他想法相关:
- 哪种存储最适合:UserDefault 或 CoreData。这取决于设置
JournalSettings
代表的类型。如果是与数据相关的设置(如参考数据对象等),我会将其存储在 CD 中。但是,如果是数据独立的常规设置,则比 UD 更好。并且不要忘记UD不能被系统清除/丢失。因此,您永远不应该在其中存储敏感/重要数据。 - 也许您不需要创建新视图。相反,您可以在另一个实体中提取与数据相关的操作(MVC 中的控制器,MVVM 中的 ViewModel ......)。在这种情况下,您将拥有独立于存储类型的单一视图。
推荐阅读
- vba - PowerShell 异常调用“无法转换 COM 对象” - 加载类型库/DLL 时出错
- openstreetmap - 如何获取与 Overpass QL 上具有特定值的多个标签匹配的节点
- c# - 在 ASP.Net Core 应用程序中向 MassTransit Saga 发送消息
- python - pandas df[df["A"]==None] 与 df["A"].values==None 不一样
- getuikit - 在 UIKit v3 中的 div 中进行粘性工作
- python - 将 Python 包安装到 docker 映像的不同方法
- amazon-web-services - 在 chrome 中测试但在邮递员中工作时访问 API 网关时缺少身份验证令牌
- android - Android导航底部片段重叠
- javascript - React JS onClick 处理程序在渲染时触发
- python-3.x - File upload using Flask