Как мне хранить UIImages в моей базе данных Core Data? - PullRequest
33 голосов
/ 11 октября 2010

Я занимаюсь разработкой приложения, для которого требуется около 100 или более изображений для предварительной вставки в базу данных Core Data вместе с другой соответствующей информацией.

Теперь я могу легко добавить другие данные, просто написав несколько строк кода, но для UIImages я не уверен, как это сделать без написания большого количества кода. Мне было интересно: есть ли в любом случае это легко сделать или нет лучшего способа добиться этого с наименьшими усилиями.

Кроме того, можно ли хранить изображения в базе данных Core Data или мы должны сохранять только адреса изображений только в локальной файловой системе?

Ответы [ 3 ]

56 голосов
/ 11 октября 2010

Хранить изображения в базе данных 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 и сохранены в базе данных.

Будет ли это делать, зависит от вашего конкретного случая. Большие изображения, вероятно, не должны храниться таким образом, или, по крайней мере, должны быть в их собственной сущности, чтобы они не загружались в память до тех пор, пока не будут соблюдены отношения с ними. Небольшие миниатюрные изображения, вероятно, можно поместить в вашу базу данных таким образом.

11 голосов
/ 11 октября 2010

Хорошим примером преобразователя изображения, как описано выше, является демонстрационное приложение iPhoneCoreDataRecipes.

9 голосов
/ 11 октября 2010

Apple предоставляет несколько советов относительно больших двоичных объектов: Большие объекты данных (BLOB)

Если ваше приложение использует большие большие двоичные объекты («Большие двоичные объекты», такие как изображения и звуковые данные)), вы должны позаботиться о том, чтобы минимизировать накладные расходы.Точное определение «маленький», «скромный» и «большой» является гибким и зависит от использования приложения.Эмпирическое правило заключается в том, что объекты размером порядка килобайт имеют «скромный» размер, а объекты размером порядка мегабайт - «большой».Некоторые разработчики достигли хорошей производительности с 10 МБ BLOB в базе данных.С другой стороны, если приложение имеет миллионы строк в таблице, даже 128 байтов могут быть CLOB «скромного» размера (крупный символьный объект), который необходимо нормализовать в отдельную таблицу.

В целомЕсли вам нужно хранить большие двоичные объекты в постоянном хранилище, вы должны использовать хранилище SQLite.Для хранилищ XML и двоичных файлов требуется, чтобы весь граф объектов находился в памяти, а записи хранилища были атомарными (см. «Функции постоянного хранилища»), что означает, что они неэффективно работают с большими объектами данных.SQLite может масштабироваться для работы с очень большими базами данных.При правильном использовании SQLite обеспечивает хорошую производительность для баз данных объемом до 100 ГБ, а одна строка может содержать до 1 ГБ (хотя, конечно, считывание 1 ГБ данных в память является дорогой операцией, независимо от того, насколько эффективен репозиторий).

BLOB часто представляет атрибут объекта - например, фотография может быть атрибутом объекта Employee.Для BLOB небольшого или небольшого размера (и CLOB) необходимо создать отдельную сущность для данных и создать отношение «один к одному» вместо атрибута.Например, вы можете создать сущности «Сотрудник» и «Фотография» с взаимно-однозначным отношением между ними, где отношение «Сотрудник» к «Фотография» заменяет атрибут «Фотография сотрудника».Этот шаблон максимизирует преимущества повреждения объекта (см. «Неисправность и уникальность»).Любая данная фотография извлекается только в том случае, если она действительно необходима (если пересекаются отношения).

Однако лучше, если вы сможете хранить большие двоичные объекты как ресурсы в файловой системе и поддерживать ссылки (например,как URL-адреса или пути) к этим ресурсам.Затем вы можете загрузить BLOB по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...