gpt4 book ai didi

macos - 使用 NSPersistentDocument 创建 'Documents'

转载 作者:行者123 更新时间:2023-12-01 09:31:26 25 4
gpt4 key购买 nike

我想创建一个使用

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

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

    NSPersistentDocument does not support some document behaviors: File wrappers. [..]



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

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

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

    最佳答案

    唯一适用于 NSPersistentDocument 的选项您想要的方式是将图像直接存储在数据库中。您的实体需要一个二进制数据属性,但您无法打开 Allows External Storage选项。

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

    Hidden Folder

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

    Document Window

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

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

    Data Model

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

    补充两点:

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com