2011-04-19 84 views
10

Core Data中是否存在任何限制?例如;一個表/實體中最多可以有多少行?數據庫中可以駐留多少數據?iOS的核心數據限制

一般來說,如果某些文檔可以描述Core Data(適用於iOS)內部存在的所有類型的限制?

更新: w.r.t由@TechZen給出的答案,我的問題暗示了I/Core Data將在後端使用sqlite的事實。但爲了清楚這一點,我打算使用sqlite,當我談論Core Data的限制時,我間接地詢問了sqlite(數據庫存儲)的限制。

那麼當我們談論iOS環境時,sqlite的limitations以外的核心數據會有什麼限制嗎?

回答

21

對核心數據本身沒有任何邏輯限制,除了那些由情境內存,磁盤空間等強加的限制。但是,如果您使用SQLite存儲,您將獲得default limitations of SQLite itself.如果您正在爲iOS編寫代碼, 。

真的,您使用Core Data遇到的唯一實際限制來自於由reading in large blobs(例如,試圖在SQLite商店中存儲圖像或音頻。這可以通過將blob存儲在外部文件中來避免。

另外,我會提醒你我可以通過你說的這個問題的方式來說明,你在考慮核心數據錯誤。

核心數據不是SQL的對象包裝器。核心數據不是SQL。實體不是表格。對象不是行。列不是屬性。核心數據是一個對象圖管理系統,它可能會或可能不會持久化對象圖,並且可能會或可能不會在後臺使用SQL來做到這一點。試圖用SQL語言來思考覈心數據會導致你完全誤解核心數據,並導致很多悲傷和浪費時間。

+2

+1。我不記得我在哪裏閱讀它,但有一個早期我學到的格言,如果我想弄清楚做什麼的限制,那麼我做錯了。 – 2011-04-19 13:38:14

+1

@Philip Regan - 我們必須保存大量的圖像,因此現在更好地檢查它,而不是稍後再考慮它? – itsaboutcode 2011-04-20 04:49:23

+1

如果ypu're保存圖片,最好將它們保存到文件中,並將一個URL存儲到Core Data中的所述文件中。存儲大量的二進制數據最好在其他地方完成。 – paulbailey 2011-04-20 07:45:55

0

核心數據是一個功能豐富且複雜的對象圖管理框架,能夠處理大量的數據。 SQLite存儲可以通過數十億行,表和列擴展到TB級數據庫。除非您的實體本身具有非常大的屬性或大量的屬性,否則10,000個對象對於數據集而言被認爲是相當小的尺寸。處理大型二進制對象時,請查看二進制大型數據對象(BLOB)。

二進制大數據對象(BLOB)

如果應用程序使用二進制大對象(BLOB),如圖像和聲音數據,你需要照顧,以儘量減少開銷。一個對象被認爲是小的還是大的取決於應用程序的使用情況。一般規則是小於兆字節的對象是小型或中型,而大於兆字節的對象很大。一些開發人員已經在數據庫中使用10 MB BLOB獲得了良好的性能。另一方面,如果應用程序在表中有數百萬行,甚至128個字節可能是一個CLOB(字符大對象),需要將其標準化爲一個單獨的表。

通常,如果您需要將BLOB存儲在持久性存儲中,請使用SQLite存儲。其他商店要求整個對象圖駐留在內存中,並且存儲寫入是原子的(請參閱持久存儲類型和行爲),這意味着它們不能有效處理大型數據對象。 SQLite可以擴展以處理超大型數據庫。正確使用SQLite可爲數據庫提供高達100 GB的性能,單行最多可容納1 GB(儘管無論存儲庫有多高效,讀取1 GB數據到內存中都是昂貴的操作)。

BLOB通常表示實體的屬性 - 例如,照片可能是Employee實體的屬性。對於小到中等的BLOB(和CLOB),爲數據創建一個單獨的實體並創建一對一的關係來代替該屬性。例如,您可以使用它們之間的一對一關係創建員工和照片實體,其中從員工到照片的關係將替換員工的照片屬性。這種模式最大限度地利用了對象斷層的好處(參見斷層和非斷層)。只有在實際需要的情況下(如果關係被遍歷),才能檢索任何給定的照片。

但是,如果您能夠將BLOBs作爲資源存儲在文件系統上並維護對這些資源的鏈接(如URL或路徑),則更好。然後您可以根據需要加載BLOB。