Как я должен хранить UIImages в моей базе данных Core Data?
Я разрабатываю приложение, которое требует около 100 изображений или, возможно, больше, чтобы быть предварительно вставленным в базу данных Core Data вместе с другой связанной информацией.
Теперь я могу легко добавить другие данные, просто написав несколько строк кода, но для UIImages я не уверен, как это сделать, не записывая много кода. Мне было интересно: есть ли все это, чтобы сделать это легко, или если нет лучшего способа добиться этого с наименьшими затратами усилий.
Кроме того, хорошо ли хранить изображения в базе данных Core Data или мы должны сохранять только адреса изображений в локальной файловой системе?
Ответы
Ответ 1
Сохранение изображений в базе данных 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 и из NSData, которые будут храниться в базе данных.
Можно ли делать это, зависит от вашего конкретного случая. Большие изображения, вероятно, не должны храниться таким образом или, по крайней мере, должны быть в их собственной сущности, чтобы они не были загружены в память до тех пор, пока не будет соблюдаться отношение к ним. Маленькие миниатюры, вероятно, прекрасны, чтобы поместить в вашу базу данных таким образом.
Ответ 2
Хороший пример трансформатора изображения, как описано выше, находится в демонстрационном приложении iPhoneCoreDataRecipes.
Ответ 3
Apple действительно предлагает некоторые советы по BLOB:
Большие объекты данных (BLOB)
Если ваше приложение использует большие BLOB файлы ( "Двоичные большие объекты", такие как изображение и звуковые данные), вам необходимо проявить осторожность для минимизации накладных расходов. Точный определение "малых", "скромных" и "большой" является жидким и зависит от использование приложения. Свободное правило большим является то, что объекты в порядке килобайты в размерах имеют "скромный" размер и порядок в мегабайты размером "большие". Некоторые разработчики добились хороших результатов производительность с 10 МБ BLOB в база данных. С другой стороны, если приложение имеет миллионы строк в таблица, даже 128 байтов может быть "скромный" размер CLOB (Character Large OBject), который необходимо нормализовать в отдельную таблицу.
В общем, если вам нужно хранить BLOB файлы в постоянном магазине, вы должны использовать хранилище SQLite. XML и двоичные магазины требуют, чтобы весь объект график находится в памяти и сохраняется записи являются атомарными (см. "Стойкие Store Features" ), что означает, что они не справляются с большими объекты данных. SQLite может масштабироваться до обрабатывать чрезвычайно большие базы данных. SQLite обеспечивает надлежащее использование производительность для баз данных до 100 ГБ, и одна строка может содержать до 1 ГБ (хотя, конечно, чтение 1 ГБ данные в память - это дорого независимо от того, насколько эффективно хранилище).
BLOB часто представляет собой атрибут лица - например, фотография может быть атрибутом сотрудника организация. Для малых и умеренных размеров BLOB (и CLOB), вы должны создать отдельный объект для данных и создать индивидуальные отношения на месте атрибута. Например, вы может создать сотрудника и фотографию объекты с взаимно однозначным отношений между ними, где отношения от сотрудника к Фотография заменяет фотография атрибут. Этот шаблон максимизирует преимущества объекта (см. "Неисправность и Uniquing" ). Любая фотография только извлекается, если на самом деле (если это соотношение пройден).
Лучше, однако, если вы способны для хранения BLOB в качестве ресурсов на файловой системы и поддерживать ссылки (например, URL-адреса или пути) к тем Ресурсы. Затем вы можете загрузить BLOB как и при необходимости.