我想创建一个使用

  • 斯威夫特
  • 核心数据
  • 以标准 macOS 方式工作的“文档”[自定义扩展名,包含与该文档相关的所有数据的单个"file"/文件包装器]

  • 这似乎是不可能的。该文件非常清楚地说明



    这让我认为在 CoreData 中处理图像的常用方法 - 带有“允许外部存储”的二进制数据并将它们保存到不同的位置,将 URL 存储在数据库中 - 不能与 NSPersistentDocument 一起使用。我希望我的用户能够对我的"file"执行通常的 Finder 操作(复制、移动到外部存储、从外部备份恢复)并且需要我的所有数据都在一个包中。

    文件存储的 SQL 版本在保存时会产生通常的三重堆栈 - .sqlite、.sqlite-shm、.sqlite-wal - 作为“文档”是无用的。

    有没有我忽略的解决方案? (示例非常少;Big Nerd Ranch sample 也不能解决这个问题;Marcus Zarra 和 Objc.io 都没有触及 NSPersistentDocument)。

    最佳答案

    以您希望的方式与 NSPersistentDocument 一起使用的唯一选项是将图像直接存储在数据库中。您的实体需要一个 Binary Data 属性,但您不能打开 Allows External Storage 选项。

    如果您打开此选项,Core Data 将根据大小决定是将图像直接存储在数据库中还是存储在文档所在文件夹内的隐藏文件夹中:

    macos - 使用 NSPersistentDocument 创建  'Documents'-LMLPHP

    (我使文件夹可见,在 Finder 中输入 cmd-shift-.)。示例文档名为 Test 1.doof,它包含三个图像:

    macos - 使用 NSPersistentDocument 创建  'Documents'-LMLPHP

    可以看到隐藏文件夹 .Test 1_SUPPORT/EXTERNAL DATA 包含两个文件,分别是两个较大的图像(1.3 MB 和 494 KB)。第三个只有 50 KB 存储在 Test 1.doof 中。如果您将 Test 1.doof 移动到另一个文件夹中,隐藏文件夹将被留下。在另一个文件夹中打开文件会导致两个图像丢失。

    如果将二进制数据放入与其余数据一对一关系的单独实体中,将图像存储在数据库中并没有那么糟糕,如下所示:

    macos - 使用 NSPersistentDocument 创建  'Documents'-LMLPHP

    这样图像就不会干扰任何搜索或排序操作。 NSPersistentDocument 免费为您提供了许多很酷的功能,因此您应该尽可能使用它。

    补充两点:

  • 如果你为一个属性打开 Allows External Storage,你就不必关心 URLs 或存储图像的位置,Core Data 会为你做这些(但对于基于文档的应用程序来说不是有用的方式)。
  • 这些 shmwal 文件是“有时”出现的临时文件,也适用于没有外部存储的数据库。如果它们粘住了,您可以在应用程序关闭时安全地移除它们。
  • 关于macos - 使用 NSPersistentDocument 创建 'Documents',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45356025/

    10-10 21:33