在已发布的应用程序中更改 Core Data 中的属性值
Posted
技术标签:
【中文标题】在已发布的应用程序中更改 Core Data 中的属性值【英文标题】:change attribute value in Core Data in already published application 【发布时间】:2013-12-11 10:12:57 【问题描述】:(实际上,我不知道如何表述我的问题,所以在 google 中我一无所获。)
所以,情况:在应用商店的应用中,我有核心数据实体(比如说天气),它的属性之一是速度类型字符串。现在它包含单行(例如 5 mps),但现在我希望它包含类似数组的字符串(例如 5 mps; 6.4 mps; ...)也将名称从“Speed”更改为“SpeedHistory”。
我做了一个新的模型版本,选择它(它现在有一个小复选框),重命名属性,设置“重命名ID”:“速度”现在:我应该怎么做,以防止用户的旧版本数据崩溃?
请给我一些建议好吗?
附:天气实体中的数据由用户填写。我正在使用 MagicalRecord。
【问题讨论】:
@DuncanGroenewald,不,但我害怕已经存在的信息。格式不同 如果你重命名了属性,那么旧属性中的任何数据都会在商店升级时丢失。请务必设置选项以允许商店升级到模型的新版本。 @DuncanGroenewald,所以之前的数据还是会被删除? 好吧,如果这就是您想要的,那么只需创建一个名为 SpeedHistory 的新属性并将旧属性保持原样或删除它,只是不要在新应用程序中使用它或将数据复制到应用首次打开时的新属性。 @DuncanGroenewald,嗯.. 在旧数据库中创建这个? 【参考方案1】:这是一个相当普遍的问题。当您在使用核心数据时更新模型时,您必须迁移它。您可以按照本教程进行操作,该教程解释了您应该如何解决您的问题:
http://www.raywenderlich.com/27657
轻量级迁移也比较简单,可以安全地执行。您只需要担心模型中的更改需要更改逻辑。
【讨论】:
感谢您的建议!实际上,我使用这个 Ray 的教程来进行迁移。问题是:如何从旧数据库中的“Speed”中删除值(现在是“SpeedHistory”)?【参考方案2】:更改列的类型是轻量级迁移无法做到的。如果您想在用户升级到新模型版本时迁移他们的数据,您需要创建一个映射模型。这个过程在 Apple 的 Core Data Model Versioning and Data Migration Programming Guide 的 Mapping Overview 部分中有描述。
我在映射模型方面没有取得多大成功,因为它们似乎非常消耗内存。
您是否考虑过添加SpeedHistory
属性而不删除Speed
属性或设置重命名标识符?然后在你的模型类中你可以覆盖awakeFromFetch:
,检查是否有Speed
,如果有则适当设置SpeedHistory
并清除Speed
。您将根据需要一次迁移一个对象。
【讨论】:
感谢您的回答。至于“更改列的类型是轻量级迁移无法完成的事情”。 - 类型仍然是 STRING,所以我说的是以某种方式保存或删除旧数据库的内容。可能是首选删除,因为在新数据库中我正在使用此内容。(它现在有不同的格式,正如我提到的) 啊,错过了。如果您只是更改属性的名称,则不应发生崩溃。您是否有您遇到的崩溃的详细信息,或者您只是担心您可能会遇到一个? 我刚刚测试,没有崩溃,但是天气实体中所有属性的所有内容都被删除了。有什么方法可以预防吗?以上是关于在已发布的应用程序中更改 Core Data 中的属性值的主要内容,如果未能解决你的问题,请参考以下文章
使用 ForEach SwiftUI Core Data 仅更改列表中的一项
无法更改 Core Data Xcode 8.2 中的关系属性
Core Data / NSFetchedResultsController - 注册与获取的对象相关的更改对象