2010-09-10 125 views
3

我有一點難題:使用直接文件管理還是使用CoreData SQLite數據庫會更好?核心數據或個人文件(iOS)

這裏是我的情況:

我有一大堆的「用戶」對象,每個「後」對象的列表中。這很容易在CoreData中完成,而且會很好 - 但是,'post'對象是從Web服務器下載的,並且它們都有唯一的標識符。我不想擁有多個具有相同ID的'post'對象。我可以通過將CoreData響應緩存到NSDictionary來解決這個問題,但是這對於應用程序的設計模式並不適用。據我所知,當我的CoreData NSManagedObjectContext添加一個新的'post'時,我將不得不查找唯一ID來檢查它的存在(快速),然後添加它,如果它不存在(慢),並更新以前如果它(快)。這實際上取代了它。你們如何處理這件事?

我一直試圖想現在幾天的替代品,但不管我看它哪一種方式,CoreData將是比我慢替代:

緩存中的文件架構/ iOS應用程序的目錄可以解決問題。是這樣的:

  • 用戶/
    • {唯一ID}。用戶
    • {唯一ID}。用戶
  • 帖子/
    • {唯一ID}。 post
    • {唯一ID} .post

然後,當檢索post對象或用戶對象時,我可以檢查文件是否存在數據,並將文件內容緩存在NSDictionary中。如果該字典中存在該ID,請從該字典中檢索該ID。替換以前的'user'和'post'對象就像覆蓋文件和更新緩存一樣簡單。

我的第二種選擇顯然會更快 - 但是,我不會利用CoreData中內置的任何效率,並且當發生內存警告時,我將不得不提供自己的內存管理方案來清除緩存的字典。

CoreData中是否存在「uniquing」方法?這將解決我的問題。類似於在普通SQLite數據庫中使用主鍵的東西。

我會開始做測試來驗證這兩種方法的速度,但我想我會在開始之前發佈這個,以防萬一任何人有更好的解決方案。

回答

3

這個確切的問題出現了很多。

您可以檢查覈心數據中是否存在一個值,而不讀取整個對象。只需設置提取以獲取要測試的特定屬性(本例中爲ID),然後將提取作爲字典返回即可。提供一個查找一個或多個ID的謂詞,如果返回的字典有值,則知道您有現有對象。

這是非常罕見的,你可以結束一個比Core Data更快,更強大的定製系統。這甚至不值得嘗試。

還請記住,不成熟的優化是所有邪惡的根源。所有這些工作都是以最簡單的核心數據實施速度緩慢爲前提。你真的測試過它會放慢嗎?如果沒有,那麼在嘗試更復雜的設計之前就這樣做。

+0

感謝您的提示。把我放在正確的方向! CoreData比我預期的要快得多。 – Ryan 2010-09-11 00:50:07

+0

@TechZen,實際上是在尋找這個。謝謝。 – Peres 2012-12-14 20:11:42

2

經過測試,我發現CoreData至少減少了一半的時間。我正在運行的測試如下:我將1000個帖子添加到空的CoreData對象圖中;然後檢索100個這些對象進行更新。添加對象的時間爲0.069s,檢索對象所用的時間爲0.181s。我在3G iPad設備上檢索了這些值。使用文件時,添加這些對象花費了10倍的時間,並且檢索它們花費了4倍的時間。

我的推薦:堅持使用CoreData!