2015-05-01 113 views
4

我正在考慮使用兩個persistent store coordinatorPSC1只讀一個SQLite DBPSC2讀寫DB。有時PSC1DB重新加載內容兩個NSPersistentStoreCoordinator可以使用相同的數據庫嗎?

你認爲這是可能的嗎?

您是否認爲兩個PSC可以以原子方式讀取/寫入數據庫,而不會導致任何損壞?

PSC是否對數據庫設置了鎖定,以便從其他PSC進行訪問?

+0

沒有嘗試過,但我認爲它可以使用NSReadOnlyPersistentStoreOption。結帳https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSPersistentStoreCoordinator_Class/index.html#//apple_ref/doc/constant_group/Store_Options – JakubKnejzlik

+0

您可能會對[此方法]感興趣, (http://martiancraft.com/blog/2015/03/core-data-stack/),它使用2個'NSManagedObjectContext's。 – johnpatrickmorgan

+0

您可能想要展開爲什麼要這樣做。你想要的最後一件事是不必要地過度優化你的核心數據棧。我很想看看你目前看到了什麼樣的表現,以及爲什麼你認爲你需要協調員來提高這一點。 –

回答

5

您可以有兩個不同的NSPersistentStoreCoordinator實例訪問相同的文件。事實上,多年前這是一個推薦的方法。

但是,這樣做有問題。如果一個NSPersistentStoreCoordinator發生了寫入文件系統的更改,另一個NSPersistentStoreCoordinator實例將不知道它。 NSPersistentStoreCoordinatorNSManagedObjectContext維護它們管理的對象的內存狀態。使用兩個NSPersistentStoreCoordinator實例會導致它們在某個時刻不同步。例如,如果NSPersistentStoreCoordinator A從NSPersistentStore中的記錄加載對象,則會有該對象的內存版本。如果NSPersistentStoreCoordinator B然後刪除由相同記錄支持的對象,則A的對象版本沒有記錄。當Core Data試圖在A中對該對象進行故障時,您將得到一個異常。

您是否認爲兩個PSC可以以原子方式讀取/寫入DB,而不會導致任何損壞?

損壞對於NSSQLiteStoreType商店來說很少出現問題。與其他商店,這當然是可能的。

PSC是否對數據庫設置了鎖定,以便從其他PSC進行訪問?

內置的NSPersistentStore具體類我們在訪問文件系統的記錄(但不總是用於元數據)時協調文件。所以是的,有一個鎖涉及到,它應該防止兩個NSPersistentStore實例同時修改相同的文件。

如上所述,這不是你應該關心的問題。使用多個協調器時,協調員的內存狀態及其上下文是一個更加緊迫的問題。

相關問題