Как я должен хранить 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 как и при необходимости.