事后修改 Core Data 中现有的对象属性
Posted
技术标签:
【中文标题】事后修改 Core Data 中现有的对象属性【英文标题】:Modifying existing object attributes in Core Data after the fact 【发布时间】:2010-04-04 07:51:39 【问题描述】:在previous question 中,我正在寻找一种替代方法来修改“无日期”如何存储在我的 NSManagedObject 子类的日期属性中。以前,当用户未指定日期时,我已将 nil 分配给该属性。为了解决使用 NSFetchedResultsController 时的排序问题,我决定在用户未指定日期时将 [NSDate distanceFuture] 指定给日期属性。但是,鉴于这个应用程序已经在野外,我需要更新 Core Data 存储,以便将任何现有的 nil 日期值更改为 [NSDate distinctFuture]。
进行此更改的最佳方法是什么?首先想到的是遍历存储在数组中的所有对象并更改找到的任何 nil 值。这可以通过检查指示是否已执行此升级的用户默认键来限制为一次性事件。有没有办法可以用 Core Data 版本控制来做到这一点?或者其他不涉及我编写一次性代码的方法?
【问题讨论】:
【参考方案1】:如果您要发布更新,请考虑创建模型的新版本。将 date 属性设置为必需(非可选)并提供一个遥远的未来日期作为默认值。在从当前正在发布的旧模型迁移到即将发布的新模型的过程中,Core Data 将填写一次当前 nil 日期的默认值。
这也避免了开发人员编写代码;我很懒,所以这条路对我很有吸引力。
【讨论】:
【参考方案2】:我想还有其他方法,但一次性修复代码和默认标志可能是最有效的。您可以在日期中检查 nil 以触发代码,但对于非平凡数据量,默认值会更快。
【讨论】:
【参考方案3】:使用带有NSPredicate
的提取请求,该请求仅匹配您要调整的NSDate
属性的nil
值。不要执行提取,而是使用-[NSManagedObjectContext countForFetchRequest:error:]
这将比执行 fetch 快得多,如果您得到非零结果,请继续并执行 fetch,但不要获取您不需要的属性,也不要获取关系。如果计数确实很大,请设置 fetch 批量大小以将内存使用量的高水位线保持在最低限度。
【讨论】:
以上是关于事后修改 Core Data 中现有的对象属性的主要内容,如果未能解决你的问题,请参考以下文章
谓词因从 Core Data 获取属性类型为“NSDate”对象的对象而失败