2009-11-07 50 views
5

我想將核心數據用作數據庫服務器上較大數據集的緩存。 並非所有數據都會在內存中。使用內存存儲的核心數據

在想着這進一步兩個問題浮現在腦海:

  1. 能斷層(例如用於1-n的關係)與內存中的持久性存儲使用,如果是這樣,你怎麼了抓到故障射擊?

  2. 核心數據管理對象上下文具有陳舊間隔。這是否也適用於內存存儲?

或者我應該爲此使用NSAtomicStore嗎?

+0

幾乎聽起來像你真正想要做的是實現你自己的存儲層:被管理的對象,故障返回到你的數據庫服務器的持久性存儲。 – 2009-11-07 17:41:36

+0

是的,但要做到這一點的唯一方法是NSAtomicStore(在Mac OS X 10.5+中),然後您必須一次將所有內容加載到AFAIK中。 – diederikh 2009-11-07 17:59:01

回答

11

你的第一個問題表明你誤解了NSInMemoryStore類型持久性商店的意圖。它們是永久存儲部分的核心數據堆棧。將實例帶入托管對象上下文時會發生錯誤;將創建一個故障,在啓動時從NSPersistentStoreCoordinator的緩存或基礎持久性存儲中啓動並填充自身。內存中的存儲不會更改錯誤關係。顯然,它不會真的幫助你的問題,但是因爲你必須堅持所有的數據到內存。內存存儲對於(1)測試(它們很快)和(2)臨時內核存儲實際上適合您使用Core Data的對象圖管理,而無需將任何內容保存到磁盤。

針對你的第二個問題,答案是肯定的。過時間隔適用於上下文,而不適用於持久性存儲。

因此,核心數據是否適合從遠程數據庫服務器緩存數據?不是真的。儘管Bill Bumgarner(蘋果工程師)暗示說這是可能的,但我發現在自己的代碼中將緩存與核心數據對象圖形管理分開更容易。使用Core Data來管理對象圖和便於綁定到Controller/UI層仍然非常好。所以我的策略是從數據庫服務器提取數據並將其緩存在我自己的數據結構中(OS X 10.6中的libcache和NSCache可能是一個很好的起點)。然後在你的對象圖中決定你想要什麼,並將它遷移到核心數據棧(由內存中的持久存儲支持)。您必須自己處理來自數據庫服務器的更改通知或輪詢。當數據庫中的數據發生變化(或用戶查詢發生變化等)時,我只需告訴所有編輯人員完成編輯,然後擦除上下文並從(可能)更新的緩存中重建該上下文。

+0

你說得對,我認爲出於某種原因,內存存儲會處理與上下文不同的思考(以防止內存中的對象兩次)。但這當然不是這種情況。 我也看過NSAtomicStore來將東西加載到持久性存儲協調器的緩存中。我看到的問題是我無法控制對象的過時(我不想在緩存中加載整個數據庫)。我希望更多的不像Sqlite商店一樣的行爲。 使用NSCache,我可以看到你設置了緩存中對象的最大數量限制。這很好。 – diederikh 2009-11-08 07:05:19

+0

@barrywark,根據你的回答,我是否正確第2項「你要使用Core Data的對象圖管理而不必將任何東西保存到磁盤中的臨時內核數據堆棧」意思是「如果你想將核心數據堆棧存儲在在磁盤或存儲空間不足時保存到磁盤之前的內存「?因此,在某些情況下,如果我想將數據存儲在內存中(因爲磁盤不可用),我可以將數據存儲在內存中。 – gaussblurinc 2017-05-09 13:45:36