我想创建一个使用
的应用这似乎不可能。文档非常明确地说明了
NSPersistentDocument不支持某些文档行为: 文件包装器。 [..]
这让我觉得在CoreData中处理图像的常用方法 - 二进制数据与'允许外部存储'和将它们保存到不同的位置,将URL存储在数据库中 - 不能与NSPersistentDocument一起使用。我希望我的用户能够在我的'文件'上执行常规的Finder操作(复制,移动到外部存储,从外部备份恢复)并且需要将所有数据放在一个包中。
文件存储的SQL版本在保存时会产生通常的三重堆栈 - .sqlite,.sqlite-shm,.sqlite-wal - 这对于'文档'来说是无用的。
有没有我忽略的解决方案? (示例非常稀疏; Big Nerd Ranch sample也没有解决这个问题; Marcus Zarra和Objc.io都没有触及NSPersistentDocument)。
答案 0 :(得分:2)
唯一可以按照您希望的方式使用NSPersistentDocument
的选项是将图像直接存储在数据库中。您的实体需要二进制数据属性,但无法启用Allows External Storage
选项。
如果启用此选项,Core Data将根据大小决定是将图像直接存储在数据库中还是存储在文档所在文件夹内的隐藏文件夹中:
(我在Finder中将文件夹显示为cmd-shift-.
)。示例文档名为Test 1.doof
,它包含三个图像:
您可以看到隐藏文件夹.Test 1_SUPPORT/EXTERNAL DATA
包含两个文件,即两个较大的图像(1.3 MB和494 KB)。只有50 KB的第三个存储在Test 1.doof
内。如果将Test 1.doof
移动到另一个文件夹中,则会隐藏隐藏文件夹。在另一个文件夹中打开文件会导致两张图像丢失。
如果将二进制数据放入与其余数据具有一对一关系的单独实体中,则将数据存储在数据库中并不是那么糟糕,如下所示:
这样,图像不会干扰任何搜索或排序操作。 NSPersistentDocument
免费为您提供了很多很酷的功能,所以如果可能的话,你应该使用它。
另外两条评论:
Allows External Storage
,则无需关心URL或存储图像的位置,Core Data会为您执行此操作(但对于基于文档的应用程序不是有用的方式) shm
或wal
文件是临时文件,有时会出现#34;如果他们坚持,您可以在应用关闭时安全地删除它们。