2010-07-19 79 views
3

我的應用程序中有大量需要訪問的數據,但不會被應用程序更改。目前,我在JSON文件和SQL數據庫的其他應用程序中使用這些數據,但在iOS中使用這些數據都不那麼直截了當。在iOS應用程序中存儲靜態數據的最佳方式是什麼?

我不想使用CoreData,它提供了大量不必要的功能和複雜性。

將數據存儲在PropertyList文件中並構建訪問器類會不會是一個好主意?有沒有簡單的方法來合併SQLite而無需使用CoreData路線?

+0

我認爲將這些數據存儲到PropertyList是個好主意。我不知道你得到了多少數據,但如果它不是數千行,我認爲PropertyList是一個好方法。另一個問題是,你需要查詢你的數據嗎?所以sqlite可能是一個答案。 – choise 2010-07-19 09:15:05

回答

4

如果數據量相對較小,則只能使用plist。 Plist被完全加載到內存中,因此只有在需要時才能將內存中由plist創建的所有對象一次性維持到內存中,才能真正使用它們。

核心數據有一條學習曲線,但在使用中它通常不比SQL複雜。在大多數情況下,「更簡單」的SQL會導致更多的編碼,因爲最終必須複製核心數據的大部分功能,才能將過程SQL強制轉換爲面向對象的API。您必須通過跟蹤保留來手動管理所有數據的內存使用情況。您每次需要數據時都會編寫大量的SQL代碼。我已經將幾個應用程序從SQL更新爲核心數據,並且在所有情況下,核心數據實現比SQL更小,更清潔。

內存或處理器「開銷」都不會更大。核心數據經過高度優化。在大多數情況下,現成的Core Data比手動調整的SQL更有效。 SQL中的一個次要子優化通常會破壞它可能具有的任何理論優勢。

當然,如果您已經掌握了在C中管理SQL的高超技巧,那麼您個人可能會通過使用SQL更快地將應用程序推向市場。但是,如果你想知道你應該在Apple平臺上使用什麼,核心數據幾乎總是答案,你應該花時間去了解它。

3

您可以直接使用SQLite,而無需使用核心數據開銷SQLite C API

Here是我在你的用例中找到的教程 - 只需從SQLite數據庫加載一些數據。希望這可以幫助。

3

根據您的數據類型,大小以及更改的頻率,您可能希望將事情簡單化並使用屬性列表。否則,使用SQLite(記錄在Jergason的答案中)將是我要去的地方。雖然讓我說,如果你有一個相對較少(少於幾百)的基本類型(數組,字典,數字,字符串)不頻繁變化的集合,那麼屬性列表在我看來是更好的選擇。作爲一個例子,在我的一個遊戲中,我根據難度創建了單個屬性列表中的關卡。由於每個難度(99)只有少數幾個級別,並且每個參數(遊戲中的元素數量,它們的初始位置,質量等)都有一小組參數,所以它是有意義的,我不必直接與SQLite打交道或者更糟糕的是,建立和維護CoreData。

1

你是什麼意思的「最好」?什麼樣的數據?

如果它是一堆對象,那麼JSON或(二進制)plist並不是可怕的格式,因爲您希望整個事情加載到內存中以走過對象圖。比較空間效率和加載性能來選擇使用哪一個。

如果它是一堆二進制blob,然後將blob存儲在一個大文件中,對文件(NSDataReadingMapped a.k.a. NSMappedRead)進行內存映射,並將索引用於blob。 iOS框架使用了這些混合(例如,有很多.png,但也包含僅包含原始圖像數據的「other.artwork」)。

如果你的類實現了NSCoding協議,你也可以使用NSKeyedArchiver和朋友,但是有一些對象圖管理開銷,並且它產生的plist格式不太適合使用。

相關問題