2017-07-27 61 views
2

我想创建一个使用使用NSPersistentDocument打造“文档”

  • 斯威夫特
  • CoreData
  • “文件”的工作,在标准的MacOS时尚[自定义扩展,单一的“一个应用程序文件'/ filewrapper包含所有与该文件相关的数据]

这似乎不可能。该文档非常清楚地指出:

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

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

当保存 - .sqlite,.sqlite-shm,.sqlite-wal时,文件存储的SQL版本会导致通常的三重堆栈,这是无用的'文档'。

有没有我忽略的解决方案? (例子非常稀疏; Big Nerd Ranch sample也没有解决这个问题; Marcus Zarra和Objc.io都没有涉及到NSPersistentDocument)。

回答

0

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

Is NSDocument and CoreData a possible combination, or is NSPersistentDocument the only way?

+0

如何在filewrapper中创建单独的CoreData存储(sql)?链接的例子提出了一个单一的CoreData存储所有信息,单个文档使用不同类型的存储(plist等) - 而我真的在寻找一个使用CoreData的“文档”。 –

+0

你也可以在NSDocument范围内实例化一个Core Data堆栈,并将SQLite,XML或二进制文件保存在文档中。 – Ely

1

见,将与NSPersistentDocument工作,你希望它是直接存储图像数据库的方式唯一的选择。您需要实体上的二进制数据属性,但无法打开Allows External Storage选项。

如果开启这个选项,核心数据将决定 - 根据大小 - 是否将图像直接存储在数据库或文件夹内的一个隐藏文件夹,文档位于:

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一个属性,你不必在意网址或在哪里存储图像,核心数据会替你(而不是在一个有用的基于文档的应用程序的方式)。
  • 这些shmwal文件是“有时”出现的临时文件,对于没有外部存储的数据库也是如此。如果他们坚持,您可以在应用程序关闭时安全地将其移除。