使用内置 CoreData 选项将 blob 存储在外部位置

Posted

技术标签:

【中文标题】使用内置 CoreData 选项将 blob 存储在外部位置【英文标题】:Storing blobs in external location using built-in CoreData option 【发布时间】: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/… 【参考方案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 中,我宁愿将它们存储在本地数据库中。

【讨论】:

这是存储较大文件的方式。无论如何,文件都不应该存储在数据库中。

以上是关于使用内置 CoreData 选项将 blob 存储在外部位置的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 可以在 iOS 上延迟获取 BLOB 属性吗?

有没有办法将电子表格 excel 文件直接写入 blob 存储?

将 Azure 数据工厂上的数据管道从 SQL Server 复制到 Blob 存储

在云中创建 Blob 存储 UNC 路径

如何将 Core Data 与 ODBC 数据源一起使用?

什么java类型可以写入BLOB类型中