【发布时间】:2013-03-25 19:56:18
【问题描述】:
我有一个相当大的基于 Core Data 的数据库架构(约 20 个实体,超过 140 个属性),随着它从我们的 1.x 代码库迁移到我们的 2.x 代码库,它正在经历巨大的变化。
我对执行轻量级迁移非常熟悉,但我对这种特定迁移有点困惑,因为有一些实体曾经将相关对象存储为实体本身的可转换属性,但现在我想迁移那些到实际实体。
这似乎是一个完美示例,说明何时应该使用大量迁移而不是轻量级迁移,但我对此也不太满意。我不熟悉大量迁移,具有此数组的实体之一 -> 发生建模关系转换占用了数据库中约 90% 的行,这些数据库的大小往往超过 200 MB,我知道我们的大部分客户都在使用 iPad 1s。再加上 Apple 文档和 Marcus Zarra 的(优秀的)Core Data 书中关于大量迁移的速度和内存使用情况的反复警告,让我非常谨慎,并寻找另一种方法来处理这种情况。
WWDC 2010 的“掌握核心数据”会话 118(slides here,需要登录,倒数第 9 张幻灯片,标题为“迁移后处理”是我所指的)提到了一种工作方式围绕这个 - 执行迁移,然后使用存储元数据来标记您想要执行的自定义后期处理是否已完成。我认为这可能是要走的路,但对我来说感觉有点 hacky(因为没有更好的词)。另外,我担心会留下在实践中被弃用的属性。前任。如果我将实体 foo 的 barArray 属性移动到实体 foo 和实体 bar 之间的关系中,并且我将 barArray 设为 nil,barArray 仍然作为可以写入和读取的属性存在。解决这个问题的一种潜在方法是通过将它们的名称更改为前面的“不推荐使用”来表示这些属性已被弃用,并且可能覆盖访问器以断言它们是否被使用,但是使用 KVO,没有保证编译-time 解决方案会阻止人们使用它们,而且我讨厌留下“陷阱代码”,特别是因为只要我可能有仍然需要从 1.0 迁移的客户,就必须存在所说的“陷阱代码”。
这变成了比我预期的更多的大脑转储,所以为了清楚起见,我的问题是:
1)在我工作的限制条件下,大规模迁移是一个特别糟糕的选择吗? (业务关键型应用程序、缺乏大量迁移经验、数据库大小超过 200 MB、数万行、使用运行 iOS 5+ 的 iPad 1 的客户)
2) 如果是这样,第 118 节中描述的迁移后处理技术是我最好的选择吗?
3)如果是这样,我怎样才能立即/最终消除那些“已弃用”的属性,以便它们不再污染我的代码库?
【问题讨论】:
标签: ios core-data database-migration