2011-07-21 77 views
12

我知道使用Transformable數據類型是一種在Core Data中存儲數組或任何自定義對象的簡單方法。我想知道什麼時候應該使用而不是使用Transformable,而應該創建另一個實體並使用To-many關係。當*不*使用核心數據類型可轉換?

說出它是否是一個字符串數組,是否有最大數量的元素或字符串的最大長度會導致嚴重的性能問題?

+1

我不使用iPhone,但是我處理SQLite:我的決定經常歸結爲*數據將如何使用。關係(和單個實體)是使用的基礎或*是僅作爲單個單位生產/消費的數據*? (在一個「非嵌入式」環境中,我幾乎總是專門針對標準化方法進行爭論。) – 2011-07-21 21:36:17

+0

@pst關係並不重要,數據僅用作單個單元。我更加好奇數據的大小,直到它影響性能,並且最好將它們標準化。 – pixelfreak

回答

15

我想知道什麼時候不應該使用Transformable,而應該使用 來創建另一個實體並使用To-many關係。

當您絕對必須使用變形屬性時,您應該只使用變形屬性。在某些情況下,它們不是方便或捷徑,而是資源密集型的必需品。

您很少使用Core Data來存儲數據結構,如數組或字典,因爲Core Data主要用於存儲/持久性,而不是用於建模/模擬。對數據建模來說,將數據結構變成一個大而無邏輯的數據博客是沒有用的。

可變形屬性通常用於存儲某些類,它本身主動管理它所包含的數據,例如轉換UIImage,以便您可以直接從UI存儲中取出UIImage,並將其全部歸爲一個整體。

在回答您的主要問題:

我更好奇的數據有多大可能,直到它影響 性能,這是更好地規範他們。

它主要取決於尺寸和複雜度的組合。無論何時將一堆現有對象轉換爲數據blob,都必須通過轉換來讀取整個博客。因此,如果通過轉換來存儲1mb數組,則在運行反向轉換時,會將1mb數組返回到內存中。每次轉換無論多小,都比訪問常規屬性花費更多的處理時間,甚至找到另一個管理對象。因此,經常訪問大量小型變換也會導致相當大的性能下降。

它是總是更好地將大塊數據分解成實體,屬性和關係。這樣做可以免費爲您提供Core Data的所有靈活性和優化。我發現自己使用核心數據來代替數組和字典,因爲一旦你真的把自己的頭圍繞在覈心數據上,它就更容易使用。

我永遠不會使用核心數據來存儲轉換的字符串或類似的數組。如果字符串沒有邏輯並且只有幾十個字符,那麼最好將數組寫入plist文件。這會比使用可變形屬性更快更容易。

9

這實際上取決於您想如何使用可變形屬性描述的數據。

核心數據將在您的SQLite數據庫中創建一個blob列,所以幾乎不可能做任何真正的搜索或排序屬性。

反過來描述您想要與邏輯實體(通過一對多關係)一起存儲的數據將允許您利用搜索和排序功能。

該實體還有另一個關鍵優勢,就是它可以被延遲加載,並且具有可轉換屬性,您的應用程序將會花費每次對象發生故障時加載該數據的成本。如果您將一組對象編碼爲可轉換屬性,則即使您不需要磁盤上的數據,也可能導致嚴重的性能問題。

只要大小合適,您可以在blob中保留儘可能多的數據,這是無限的。這再次涉及到這種設計的性能影響,其中(特別是在iOS設備上)I/O非常昂貴且內存受限,您的應用程序可能無法將數據從存儲和內存中讀取(人們已經嘗試在CoreData SQLite商店中粘貼電影)。