Как сохранить изображение в Базовых Данных?

Просто предположение: Я делаю атрибут и делаю, это - тип "двоичный файл". Но в конце, как я использовал бы это? Я предполагаю, что негласно существует NSData? Так, чтобы атрибут на самом деле взял NSData?

6
задан dontWatchMyProfile 6 June 2010 в 17:46
поделиться

3 ответа

Этот вопрос задавали несколько раз, и ответ был немного более сложным.

Когда дело доходит до двоичных данных, вы должны определить, как их хранить, исходя из ожидаемого размера данных, с которыми вы собираетесь работать.Правило:

  • Менее 100 КБ; сохранить как двоичное свойство в основной таблице
  • Менее 1 МБ; сохранить как двоичное свойство во вспомогательной таблице, чтобы избежать избыточной выборки
  • Больше 1M; сохранить на диске и сохранить путь к файлу в таблице Core Data.

Кроме того, при сохранении изображений рекомендуется сохранять их в стандартном формате, таком как JPG или PNG. Используя трансформируемый тип свойства, у вашего подкласса может быть видимость доступа к классу UIImage , когда фактическое хранилище является представлением PNG. Я подробно рассказываю об этом в посте на Какао - моя подруга .

Обновление

Причина хранения> 1 Мб двоичных данных на диске связана с кешем. NSPersistentStoreCoordinator будет хранить кэш данных, так что когда ваше приложение запрашивает «следующий» объект, ему не нужно возвращаться на диск. Этот кеш работает действительно хорошо. Однако он маленький, очень маленький на iOS. Если вы извлечете большой кусок двоичных данных, вы можете легко удалить весь этот кеш, и все ваше приложение сильно пострадает.

18
ответ дан 8 December 2019 в 12:18
поделиться

Верно, используйте двоичный файл, который представлен как объект NSdata, тогда вы можете использовать метод класса uiimages imageWithData для получения ваших изображений.

1
ответ дан 8 December 2019 в 12:18
поделиться

Ответ Маркуса работает, но это не самый простой способ - и, AFAICT, Apple «намеревается» сделать это не так. Теоретически вы должны иметь возможность просто пометить изображение как «трансформируемое», и CD сделает все автоматически.

Это не работает, потому что в UIImage «отсутствует» реализация NSCoding - системы сериализации Apple - и поэтому преобразователь по умолчанию с компакт-диска не знает, как сохранить изображение.

Альтернатива, которая требует небольшого кода, но все же проще, чем подход Маркуса ... якобы вы сталкиваетесь с ошибками Apple. Реализация Apple CoreData (предположительно) была нарушена с 2008 года - пользовательские преобразователи игнорируются для любого хранилища данных типа "Binary".

Возвращаясь к «CD делал бы все автоматически, если бы только UIImage был настроен правильно» ... ИМХО, UIImage должен быть сериализуемым, даже если сериализация «По умолчанию» не идеальна для всех случаев. Если вы исправите это, то о чудо ... CoreData начинает сохранять / загружать экземпляры UIImage с нулевым кодированием от вас.

Вот код для сериализации всех ваших экземпляров UIImage. Все, что вам нужно сделать, это импортировать эту категорию / скопировать и вставить эту категорию в классы, где вы хотите «обновленную» версию UIImage.

@implementation UIImage (MyCategory)

- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeDataObject:UIImagePNGRepresentation(self)];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    NSData *data = [[decoder decodeDataObject] retain];

    return [[UIImage alloc] initWithData:data];
}

@end
0
ответ дан 8 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: