如何在 sqlite 核心数据文件之间正确切换?

Posted

技术标签:

【中文标题】如何在 sqlite 核心数据文件之间正确切换?【英文标题】:How to properly switch between sqlite core data files? 【发布时间】:2014-11-14 16:28:34 【问题描述】:

所以我目前在 coredata 文件之间切换时遇到了一些麻烦。场景如下:

1) 有两个用户被授权使用我的应用程序,每个用户都有自己的sqlite文件来表示自己的数据,因为需要分离关注点 2) 当用户 A 注销和用户 B 登录时......核心数据应切换到用户 B 的 sqlite 文件并仅存在于该文件中。

如果我删除用户 A 的 PSC 并为用户 B 创建一个新的,我是在安全区还是我错过了更多步骤?我注意到来自用户 A 的一些数据最终出现在用户 B 的核心数据中。

【问题讨论】:

【参考方案1】:

如果您要在持久性存储文件之间切换,并且无法将一个数据连接到另一个数据,则需要拆除整个 Core Data 堆栈,然后重新创建它。这意味着:

全部NSPersistentStoreCoordinators 全部NSManagedObjectContexts 您从 Core Data 加载的所有托管对象,位于应用程序的任何位置

这些中的每一个都需要替换为一个新实例,就像您在应用首次启动时所做的那样。因此,有时最好同时拆除整个 UI,从初始视图控制器重新加载所有内容。

如果您已将数据从托管对象复制到其他位置(其他属性或 UI 元素),您也需要确保将其删除。

NSManagedObjectModel 可以保留,因为它从不保存来自持久存储的任何数据。

【讨论】:

非常感谢您的解释。 我重新检查了我的代码,并确认在删除 PSC 后,我将 psc 变量设置为 nil,并且还将 managedObjectContext 设置为 nil。将其拆除就足够了,还是您建议我释放内存位置? 如果您使用 ARC,“dealloc”没有意义。您还需要绝对确保删除应用程序中的每个托管对象。 您是否建议我在每个实体类型的上下文中使用 deleteObject:?如果用户 B 在使用应用程序期间触发 save: 功能,这将如何影响用户 A? 不,我不建议您删除数据。我是说你必须确保内存中没有托管对象。

以上是关于如何在 sqlite 核心数据文件之间正确切换?的主要内容,如果未能解决你的问题,请参考以下文章

删除和重新创建核心数据存储的正确方法

如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1

核心数据(SQLite/iPhone)——设计注意事项?

如何针对每个用户核心数据保存数据

将大型 CSV 文件加载到核心数据中的最快方法是啥

核心数据不直接保存到 sqlite