Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 使用NSPersistentDocument创建';文件';_Macos_Core Data_Nspersistentdocument - Fatal编程技术网

Macos 使用NSPersistentDocument创建';文件';

Macos 使用NSPersistentDocument创建';文件';,macos,core-data,nspersistentdocument,Macos,Core Data,Nspersistentdocument,我想创建一个使用 迅捷的 核心数据 以标准macOS方式工作的“文档”[自定义扩展名,单个“文件”/filewrapper,包含与该文档相关的所有数据] 这似乎是不可能的。文件非常清楚地表明: NSPersistentDocument不支持某些文档行为: 文件包装器。[……] 这让我认为,处理CoreData中图像的常用方法—使用“允许外部存储”的二进制数据并将其保存到不同位置,将URL存储在数据库中—不能与NSPersistentDocument一起使用。我希望我的用户能够对我的“文件”执

我想创建一个使用

  • 迅捷的
  • 核心数据
  • 以标准macOS方式工作的“文档”[自定义扩展名,单个“文件”/filewrapper,包含与该文档相关的所有数据]
这似乎是不可能的。文件非常清楚地表明:

NSPersistentDocument不支持某些文档行为: 文件包装器。[……]

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

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


有没有我忽略的解决方案?(示例非常稀少;也不能解决这个问题;Marcus Zarra和Objc.io都没有涉及到NSPersistentDocument)

如果您想在文档中放置更多而不仅仅是一个数据库,那么您应该实现
NSDocument
,而不是
NSPersistentDocument
。在这种情况下,您无法获得对CoreData的内置支持,但可以将文档用作多种文件类型的容器


另请参见

唯一可以使用
NSPersistentDocument
的选项,即直接将图像存储在数据库中。实体上需要一个二进制数据属性,但不能启用
允许外部存储
选项

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

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

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

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

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

补充两点:

  • 如果启用属性的
    允许外部存储
    ,则不必关心URL或图像的存储位置,核心数据可以为您做到这一点(但对于基于文档的应用程序来说,这不是一种有用的方式)
  • 这些
    shm
    wal
    文件是“有时”出现的临时文件,用于没有外部存储的数据库。如果它们粘住了,你可以在应用程序关闭时安全地移除它们

如何在文件包装器中创建单个CoreData存储(sql)?链接的示例为所有信息提供了一个单一的CoreData存储,单个文档使用不同类型的存储(plist等),而我实际上是在寻找一个使用CoreData的“文档”。您还可以在NSDocument的范围内实例化一个核心数据堆栈,并保存您的SQLite,文档中的XML或二进制文件。