【问题标题】:Storing blobs in external location using built-in CoreData option使用内置 CoreData 选项将 blob 存储在外部位置
【发布时间】:2012-03-21 09:41:01
【问题描述】:

我管理了具有图像属性的对象。由于在 CoreData 中存储大 blob 不是一个好主意,因此我尝试使用内置的 CoreData 选项“Store in External Record File”,您可以在 Data Model Inspector 中看到该选项。

尽管启用了此选项,但我没有看到任何图像数据存储在外部。从大小来看,它们似乎仍然保存在 sqlite 文件中。有什么问题?

【问题讨论】:

  • 为什么在 CoreData 中存储 blob 不是一个好主意?
  • 我应该说大 (100kb+) blob。
  • 如果您的 Core Data 存储最终变得非常大(可能会导致很多小 blob),那么您最终可以将轻量级自动模式迁移作为 PITA。看到这个:hamishrickerby.com/2012/06/04/…

标签: ios core-data blob


【解决方案1】:

如果您的商店类型为NSSQLiteStoreType,则您的属性为NSBinaryDataAttributeType。您已启用setAllowsExternalBinaryDataStorage,并且您的对象数据大小大于大约 1MB。

  • 小于 1MB 的对象存储在 sqlite 数据库中。
  • 较大的对象只是对外部文件的引用。

您会在与持久存储相同的位置的隐藏子目录中找到(外部)文件。

<path>/<database>.sqlite
<path>/<your_database>_SUPPORT/_EXTERNAL_DATA/

【讨论】:

  • 哇。你的意思是核心数据会自动决定这一点。这真是太棒了。
  • 是的,此行为已使用 CoreData 和 iOS 5.1 进行了测试
  • @marcusg 感谢分享! setAllowsExternalBinaryDataStorage 是否适用于可转换属性?
  • @pshah 我没有尝试过使用 Transformable 属性,但是如果你使用支持 NSBinaryDataAttributeType 作为核心数据类型的转换器,我不知道为什么它应该工作。
  • @pshah - 你能详细说明一下吗? NSValueTransformer 只导出它正在转换的类(当涉及到可转换的 CoreData 属性时,NSData)。尽管我的图像每个都超过 10MB,但我无法使“外部存储”工作。添加具有 1 个字符串和 1 个可转换(图像)的 3 个实体后,.sqlite 存储为 40MB。我在存储文件附近看不到任何隐藏目录。
【解决方案2】:

sqlite2 不允许 BLOB 数据的大小超过 1MB,但是 sqlite 3 允许更大的 BLOB。首先检查您使用的 sqlite 版本。 如果您的文件在 MB 中,我宁愿将它们存储在本地数据库中。

【讨论】:

  • 这是存储较大文件的方式。无论如何,文件都不应该存储在数据库中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多