我正在開發一個應用程序,它需要大約100個圖像或者更多的圖像以及其他相關信息被預先插入到核心數據數據庫中。我應該如何將UIImage存儲在我的Core Data數據庫中?
現在我只需寫幾行代碼就可以輕鬆添加其他數據,但是對於UIImages我不確定如何在不編寫大量代碼的情況下執行此操作。我想知道:無論如何要做到這一點很容易,或者如果沒有最好的方式來實現這一點,用最少的努力。
此外,可以將圖像存儲在覈心數據數據庫中,還是隻應保存本地文件系統上的圖像地址?
我正在開發一個應用程序,它需要大約100個圖像或者更多的圖像以及其他相關信息被預先插入到核心數據數據庫中。我應該如何將UIImage存儲在我的Core Data數據庫中?
現在我只需寫幾行代碼就可以輕鬆添加其他數據,但是對於UIImages我不確定如何在不編寫大量代碼的情況下執行此操作。我想知道:無論如何要做到這一點很容易,或者如果沒有最好的方式來實現這一點,用最少的努力。
此外,可以將圖像存儲在覈心數據數據庫中,還是隻應保存本地文件系統上的圖像地址?
將圖像存儲在Core Data數據庫中很容易。你只需要將你的圖像屬性標記爲可變形的屬性並創建NSValueTransformer的子類。在該子類中,添加如下代碼:
+ (Class)transformedValueClass
{
return [NSData class];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)transformedValue:(id)value
{
if (value == nil)
return nil;
// I pass in raw data when generating the image, save that directly to the database
if ([value isKindOfClass:[NSData class]])
return value;
return UIImagePNGRepresentation((UIImage *)value);
}
- (id)reverseTransformedValue:(id)value
{
return [UIImage imageWithData:(NSData *)value];
}
爲了您的可轉換屬性,指定此子類的名稱作爲值轉換名稱。
然後,您可以創建一個NSManagedObject子類主辦這次圖像屬性的實體和聲明屬性爲這個圖象屬性:
@property(nonatomic, retain) UIImage *thumbnailImage;
您可以閱讀UIImages和寫入UIImages此屬性,它們將被透明更改爲和從NSData存儲在數據庫中。
是否這樣做取決於您的具體情況。較大的圖像可能不應該以這種方式存儲,或者至少應該放在它們自己的實體中,以便在跟隨它們的關係之前不會將它們提取到內存中。小縮略圖圖像很可能以這種方式放入數據庫。
蘋果確實提供各地BLOB的一些建議: Large Data Objects (BLOBs)
如果應用程序使用大的BLOB (「二進制大對象」,如圖像 和聲音數據),你需要照顧 減少開銷。 「small」,「modest」和 「large」的確切的 是流暢的並且取決於應用的使用。 拇指的鬆散規則是大小爲 大小的對象的大小爲「適度」 大小,而大小爲 大小的那些大小爲「大」大小。 某些開發人員在 數據庫中使用10MB BLOB取得了良好的 性能。另一方面,如果一個 應用程序在 表中有數百萬行,甚至128個字節可能是 「適度」大小的CLOB(字符大 對象),需要將 標準化爲單獨的表。
通常,如果您需要將BLOB 存儲在持久性存儲中,則應該使用 SQLite存儲。在XML和二進制 店要求整個對象 圖駐留在內存中,並存儲 寫是原子(見「持久 存儲功能」),這意味着他們 做大量 數據對象不能有效地處理。 SQLite可以擴展到 處理極大型數據庫。 如果使用得當,SQLite的提供數據庫高達100GB, 和單排好 性能最多可容納1GB (儘管當然讀 1GB的數據到內存中的是昂貴的 操作無論多麼高效 庫) 。
甲BLOB往往代表的實體 - 例如一個屬性 ,照片 可能是一個Employee 實體的一個屬性。對於小規模適中的BLOB (和CLOB),你應該創建一個單獨的 實體數據和 創建屬性的地方 一個一對一的關係。例如,您可以創建員工和照片 實體,它們之間具有一對一的 關係,其中 與員工的關係爲 照片取代了員工的 照片屬性。這種模式 最大化對象 斷層的利益(見「斷層和 Uniquing」)。任何給定的照片是 ,只有當它實際上是需要 (如果關係是 遍歷)檢索。
這是更好的,但是,如果你能 到的BLOB存儲上的文件系統 資源,保有環節 (如URL或路徑)的 資源。然後可以在需要時加載BLOB作爲 。
上述圖像變換器的一個很好的例子是在iPhoneCoreDataRecipes演示應用程序中。
優秀!感謝您的領導! – Fogmeister 2012-07-14 22:43:23
以下是該示例的當前鏈接:https://developer.apple。COM /庫/內容/ samplecode/iPhoneCoreDataRecipes /簡介/ Intro.html – 2016-11-11 21:19:53
只是跟進,現在任何人都檢查了這一點:UIImage的現在符合NSCoding在IOS 5,如果你能定位到iOS 5及更高版本,你可以設置該屬性和可轉換和完成。您還可以選中「允許外部存儲」以使更大的圖像自動保存在Core Data存儲區之外。 – atticus 2012-02-06 23:51:49
由CoreData自動生成的代碼具有id而不是UIImiage *作爲屬性。這是正常的嗎?我們應該改變它嗎? – 2012-10-08 09:05:06
@JimThio - 對,這是默認設置。因爲我知道我將設置一個UIImage到這個轉換後的屬性,我將這個類型改爲UIImage。這有助於保持我的代碼清晰,並在我嘗試以錯誤的方式使用此屬性時提供完整性檢查。 – 2012-10-08 14:22:30