在previous question中,我正在寻找一种替代方法来修改我的NSManagedObject子类的date属性中如何存储“无日期”。以前,当用户没有指定日期时,我已将nil分配给该属性。为了解决使用NSFetchedResultsController时的排序问题,我决定在用户没有指定日期时将[NSDate remoteFuture]分配给date属性。但是,鉴于此应用程序已经存在,我需要更新Core Data存储,以便将任何现有的nil日期值更改为[NSDate distantFuture]。
进行此更改的最佳方法是什么?首先想到的是迭代遍历数组中存储中的所有对象并更改找到的任何nil值。通过检查指示是否已执行此升级的用户默认密钥,可以将此限制为一次性事件。有没有办法可以用Core Data版本来做到这一点?还是另一种不涉及我写丢弃代码的方法?
答案 0 :(得分:2)
如果您要发布更新,请考虑创建模型的新版本。将date属性设置为required(非可选),并提供一个遥远的未来日期作为默认值。核心数据将在迁移过程中从旧的当前发货模型到即将发布的新模型填写当前零日期的默认值。
这也避免了开发人员编写的代码;我很懒,所以路径对我很有吸引力。
答案 1 :(得分:0)
我猜还有其他一些方法,但是一次性修复了一些代码,默认情况下的一个标志可能是效率最高的。您可以在日期中检查nil以触发代码,但对于非trival数据卷,默认值会更快。
答案 2 :(得分:0)
使用NSPredicate
的抓取请求,该抓取请求仅匹配您要调整的nil
属性的NSDate
值。请使用-[NSManagedObjectContext countForFetchRequest:error:]
这比执行fetch快得多,如果得到非零结果,继续并执行fetch,但不要获取不需要的属性,也不要获取关系。如果计数非常大,请设置获取批量大小,以使内存使用率的高水位标记保持最小。