外部记录文件中iOS存储的核心数据

时间:2013-04-13 04:09:01

标签: ios core-data

第一次在这里问一个问题,如果我没有提供足够的信息,请放心。基本上我的iOS应用程序的一部分允许用户拍摄将存储​​在Core Data存储中的图片。该属性是Transformable类型,我创建了一个NSManagedObject子类,我只是用它来将其image属性设置为用户提供的新图像。

我知道在Core Data中存储大文件是一个坏主意,这就是为什么当我在Core Data实体中的image属性下看到“Store in External Record File”选项时,我很兴奋。然而,我的应用程序性能说不然,在iPhone 5上花费几秒钟只加载一些图像(我知道听起来不是很多时间,但考虑到iPhone 5有多强大,旧设备可能需要更长的时间相同的数据)。

我环顾四周,有人说“外部记录文件中的存储”选项仅适用于OS X环境,即使它在iOS应用程序中可用。但是,我也在Apple的"What's New in iOS 5" doc下看到了这一点(它是核心数据下的最后一项,接近结尾):

  

托管对象支持两个重要的新功能:有序关系和属性值的外部存储。如果指定托管对象属性的值可以存储为外部记录,则核心数据启发式地基于每个值确定是否应将数据直接保存在数据库中或将URL存储到单独的文件中它为您管理

所以我的问题是,谁是对的?苹果公司在为iOS应用程序提供此选项时犯了错误,除非您使用的是Mac,否则它实际上什么也没做,或者它实际上是做了什么而且我没有以正确的方式配置它,或者是它做它应该做的事情而且表现还不错?

我已经看过一些指南,解释如何将大文件(如图像)存储为文件,并将URL保存到Core Data存储中,但是因为这实际上是这个新选项正在做的,或者应该是我正在做,我不确定遵循这些指南是否会有所帮助。

如果之前有人询问,我真的很抱歉。通常情况下,我可以自己解决这个问题,但Core Data对我来说是全新的,我仍然不确定我是如何通过初始设置吱吱作响的。感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:8)

谁是对的?

NSAttributeDescription类的iOS文档集确实提到了allowsExternalBinaryDataStoragesetAllowsExternalBinaryDataStorage:方法,因此Apple几乎没有错误。

你做错了什么还是慢了?

你说那个

  

该属性是可转换类型

但核心数据的类型为Binary data。也许只有这一个与外部存储功能相关联。

如果不是,我们这里没有足够的信息:

  • 您存储了多少张照片?
  • 它们的尺寸是多少?
  • 您是否自动获取所有图片?

此外,Apple文档指出:

  

核心数据启发式决定每个值......

  • 您是使用迁移还是从头开始?

您可以在应用的沙盒中查看您的图片是否真的保存在CoreData之外。

希望这有帮助。

答案 1 :(得分:3)

好问题!

查看此帖子: Storing blobs in external location using built-in CoreData option

显然它应该有效。您还应该在模拟器中尝试并检查应用程序数据文件夹以查看文件夹是否按照描述创建(〜/ Library / Application Support / iPhone Simulator / ... - 您将找出路径的其余部分)。您还可以使用sqlite3命令检查sqlite文件,以查看二进制数据是否在数据库中。

我没有亲自使用此选项,因为我更愿意手动将图像保存在文件夹中,并在数据库中存储对它们的引用。这样,从要显示的文件创建UIImage对象将更容易,可以更好地控制在哪里等等。虽然会需要一些额外的劳动力!

希望能帮到你。