更改核心数据关系验证规则

时间:2016-07-14 10:46:35

标签: ios sqlite core-data database-migration

这是一个奇怪的。在我的数据模型中,我创建了一个新版本,并将关系修改为可选(而非非可选)

使用以前的型号版本创建的大型数据库运行我的更新应用程序将导致第一次保存运行速度非常慢。每次启动应用程序后都会发生这种情况!

如果我使用我更新的应用程序从头开始构建一个大型数据库(意味着,使用新的模型版本),那就不会有问题。

有什么想法吗?

更新1: 我没有提到一个重要的事实,即修改后的关系(从non-optional修改为optional)与包含大量二进制数据(blob)的图像实体相关联。 / p>

所以,在添加-com.apple.CoreData.SQLDebug 1后,我想到了以下内容:

  • 在添加的模型版本之后,有一个轻量级迁移,它可以重建映像表并重新生成所有索引。
  • 在第一次保存时会发生以下情况:
    1. BEGIN EXCLUSIVE
    2. 很少UPDATE
    3. COMMIT(非常快!)
    4. pragma page_count
    5. pragma freelist_count
    6. pragma incremental_vacuum(4055)(很慢,差不多4秒!)

pragma incremental_vacuum在iPhone 6设备上花了将近4秒钟,在慢速设备上花费的时间则更长(超过10秒)。

请注意,在第一次保存时,无论您开发哪种应用,都会在应用加载后始终执行步骤1-5。

我个案的独特之处在于我还得到了incremental_vacuum。我可以看到为什么要调用它(我猜是因为在轻量级迁移阶段重建大型图像表有太多未使用的页面),但是,我无法理解它为什么被调用稍后的应用程序加载。

incremental_vacuum的第一次调用是否应该修复未使用页面的问题并相应地更新sqlite文件?似乎incremental_vacuum的结果保存在内存中而不保存到文件中(尽管确实保存了文件)

1 个答案:

答案 0 :(得分:0)

首先在核心数据中保存图像不是一个好习惯。相反,您可以尝试将图像保存在文档目录中,并将其路径放在数据库中。较大尺寸的图像会大大减慢保存操作。

保存核心数据需要时间的另一个原因是,如果我们在您尝试保存的每个实体的for循环中调用managedObjectContext.save()。而是插入所有实体并调用save()一次。