2012-06-01 79 views
0

這個問題已經被問了很多次,我讀過很多用戶,告訴我們不建議將圖像存儲在數據庫中,特別是在CoreData中。他們似乎都忽略了他們這樣做的原因。即使蘋果公司的文件也說明了這一點,每個人都指出了這個方向,每一次討論都是這樣結束的,「你可以,但存儲路徑會更好」。提供示例爲什麼不建議將圖像存儲在CoreData中?

除了意見,我想有一個具體的例子,爲什麼它不是一個好的解決方案。

我解釋得更好,我在構建Web應用程序方面有很強的背景。從我的角度來看,一個具體的例子可能是:不要將圖像存儲在數據庫中,而是存儲在數據庫中的路徑,因爲您可以通過網絡服務器爲它們提供服務,從而可以應用所有緩存問題。

但在桌面環境中,特別是在iOS的應用程序,什麼是使用sqllite具有存儲核心數據的缺點,提供:

有一個獨立的實體持有的圖像,它不是一個屬性 的主要實體

也似乎是圖像的限制100kb。爲什麼? 110,120 ... 200kb ecc會發生什麼?

感謝

回答

4

Core Data通常在這裏做什麼沒什麼特別的。它只是使用SQLite數據庫。你可以將大量的數據放入其中,但它不能很好地擴展。你可以在這裏閱讀更多關於它的信息:Internal Versus External BLOBs in SQLite

也就是說,核心數據具有用於其在覈心數據術語被稱爲存儲在外部記錄外部斑點(iOS的5.0和更高)的支持。再一次,它沒有任何魔力,它只是將大塊數據存儲在文件系統中,而不是從SQLite數據庫本身。好處是Core Data爲您更新了所有這些內容。

當你在Xcode的時候,就會有一個名爲複選框允許外部存儲,你可以檢查二進制數據性能。

+0

這是一個很好的答案 – Leonardo

1

文件系統和API:■圍繞它(就像一個網絡服務器)進行了優化,以提供文件服務,任何尺寸,並酌情應用緩存。

CoreData針對處理帶有小塊數據的對象圖進行了優化,如整數和短字符串。

另外,還有一些其他問題會逐漸增加,比如週期性清空SQLite數據庫CoreData的使用,或者它不能縮小,只是增長。

+1

這是不完全正確,你有定期真空SQLite數據庫。您可以指定一個'PRAGMA auto_vacuum'並將其設置爲'FULL'或'INCREMENTAL'來避免這種情況。更多信息請參見[SQLite文檔](http://www.sqlite.org/pragma.html#pragma_auto_vacuum)。 –

+0

謝謝Daniel。這很好。 – geon

0

萊昂納多,

獅/ iOS 5中,核心數據處理開始的BLOB較大的爲你的文件系統存儲。

這個選擇實際上取決於你打開多少張圖片。如果你有很多,那麼你應該把它們保存在數據庫中。爲什麼?由於您只有少量的文件描述符,其中一個用於存儲在文件系統中的每個打開的圖像。

這就是說,仍然有理由自己管理文件。如果你的BLOB真的很大,比如說2MB,你會想把它們映射到內存中,而不是隻讀入它們。(當內存警告來臨時,這會讓操作系統自動從內存中清除它們。好東西)。即便如此,你仍然有數量有限的文件描述符問題。

安德魯

相關問題