核心数据迁移:除了少数特定对象之外,是不是可以删除旧存储?
Posted
技术标签:
【中文标题】核心数据迁移:除了少数特定对象之外,是不是可以删除旧存储?【英文标题】:Core Data Migration: Possible to delete old store except for a few specific objects?核心数据迁移:除了少数特定对象之外,是否可以删除旧存储? 【发布时间】:2015-07-16 20:38:52 【问题描述】:我们的应用程序的新版本是一个完整的重做,几乎在所有方面都不同。阅读有关迁移的内容,我想我肯定会落入沉重的阵营(增加的关系),但我不确定我是否真的需要大部分数据,也不确定我是否有能力进行复杂的迁移。话虽如此,我意识到用户可以保存最喜欢的故事,并且我想保留其中的一些数据(但现在并不是整个 NSMO 作为一个故事实体完全不同)。但这就是我所需要的,只是来自几个 NSMO 的几条数据。
我已经使用-isConfiguration:compatibleWithStoreMetadata:
进行了检测设置,并使用-removeItemAtURL:
作为麦汁案例场景完全删除了旧存储,但是在我删除和构建新对象之前有什么方法可以获取一些东西吗?
【问题讨论】:
【参考方案1】:是的,您可以使用旧模型建立旧存储,然后从中获取数据并手动将其插入新堆栈。然后删除旧商店。实际的工作流程是:
新模型是一个完全独立的文件 新商店是一个完全独立的文件(新文件名)然后:
-
在磁盘上查找旧文件名。如果它不存在,只需站起来堆栈
站起来旧堆栈。
建立新的堆栈。
将数据从旧堆栈复制到新堆栈。
保存新堆栈。
释放旧堆栈并从磁盘中删除旧存储文件。
无需迁移。
我添加了旧模型文件。然后在 psc 方法中,我检测是否兼容,如果不兼容,则站起来旧堆栈,启动模型和 psc 都指向我刚刚添加的旧堆栈,然后创建上下文。为我需要的实体添加了旧的类文件,并只获取了收藏夹,它起作用了!我知道我可以创建新对象并插入新堆栈,但是保存新堆栈并在完成后释放旧堆栈的最佳方法是什么?即使在 removeitematurl 之后,我似乎仍然能够获取。应用程序委托是所有这一切的最佳场所吗?
首先,AppDelegate 不是适合这个的地方。创建一个子类NSObject
的DataController
。将所有核心数据代码放在那里,然后传递 DataController
。
接下来,您不是在寻找迁移状态。您正在使用NSFileManager
查找磁盘上的文件。如果旧文件存在,则将旧存储和新存储站起来,将数据复制过来。然后删除旧文件。
要释放旧堆栈,只需将引用(MOM、PSC 和 MOC)设置为 nil
。 ARC 会将它们从内存中删除。
【讨论】:
非常感谢您的帮助,来自这样一位核心数据专家的帮助,哇!我将尝试这些步骤并让您知道!希望我能跟进,而不是听起来像个白痴。新模型和存储是一个新文件是完美的,因为我为新版本开始了一个新项目。 再次感谢,如果您不介意,请提出几个问题。在从头开始的新项目中......我添加了旧模型文件。然后在 psc 方法中,我检测是否兼容,如果不兼容,则站起来旧堆栈,启动模型和 psc 都指向我刚刚添加的旧堆栈,然后创建上下文。为我需要的实体添加了旧的类文件,并只获取了收藏夹,它起作用了!我知道我可以创建新对象并插入新堆栈,但是保存新堆栈并在完成后释放旧堆栈的最佳方法是什么?即使在 removeitematurl 之后,我似乎仍然能够获取。应用程序委托是所有这一切的最佳场所吗? 对不起,获取保存部分,但不确定释放,将上下文设置为零? 非常感谢!我认为delegate不好,我会把它移开。检查文件是否有效(虽然我发现设备区分大小写,但模拟器不区分)并且将内容排除在外是有道理的,再次感谢!以上是关于核心数据迁移:除了少数特定对象之外,是不是可以删除旧存储?的主要内容,如果未能解决你的问题,请参考以下文章