当用户第一次运行我的应用程序的更新版本时,我正在进行Core Data轻量级迁移。迁移工作正常,但是当数据库很大时,即使迁移真的应该是微不足道的,也可能很慢。
特别是,我想要做的就是向数据模型添加一个新实体,新实体实际上与任何现有实体完全无关(与现有实体没有关系,除了旧实体和新实体都是NSManagedObject)。本质上,这个操作应该只是在SQL中添加一个空表,没有?
当main.sqlite文件具有非平凡的大小(比如几百兆字节)时,在我的机器上运行轻量级迁移可能需要5秒或更多(见下文)(OSX 10.10.1,大约2年)旧Mac Mini)。
事实上,根据我的经验,新实体的名称会影响操作的速度!我一直在通过设置启动参数“-com.apple.CoreData.MigrationDebug 1”和“-com.apple.CoreData.SQLDebug 1”进行调试,看起来我得到了SQL操作,例如
2015-06-24 11:41:21.711 MyApp [517:14645] CoreData:sql:UPDATE ZENTITYNAMEHERE SET Z_ENT =(Z_ENT = 9,然后10,ZZENT END)Z_ENT IN(9)
对于以后的所有实体,按字母顺序与新插入的实体相比。对于拥有大量数据的实体,这些可能需要大量时间。这实际上是预期的行为吗?!
按字母顺序为新实体提供 latest 的名称会消除上述SQL命令,但迁移仍需要很长时间才能执行。似乎Core Data实际上复制了磁盘上的整个数据,因为我看到文件名如.main.sqlite.migrationdestination_的临时文件与main.sqlite在同一目录中并且大小相同。这似乎完全没必要只是为模型添加一个新的无关实体/表,不是吗?!
有没有办法避免这种浪费并快速迁移(创建一个新表不应该花费超过我猜的毫秒数)?
非常感谢居民核心数据大师的任何帮助!
(P.S。如果这是相关的,我正在使用Xcode 6.1.1。)
答案 0 :(得分:1)
我认为如果你想使用迁移机制,那你就不走运了。核心数据确实会将所有数据复制到新商店,这可能需要相当长的时间。
一种可能的解决方案是创建第二个单独的商店来包含不相关的实体。
这增加了更多的复杂性,显然是一种权衡,但可行。如果值得麻烦,你将不得不权衡。