2017-07-27 58 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文件是「有時」出現的臨時文件,對於沒有外部存儲的數據庫也是如此。如果他們堅持,您可以在應用程序關閉時安全地將其移除。