Android: сохранение неизменной ссылки на изображения в базе данных

товарищи программисты! Я новичок ... надеюсь, вы можете помочь!

Так. В настоящее время я разрабатываю приложение, которое позволяет пользователям выбирать четыре разных изображения из набора изображений, которые я сохранил в своей папке res/drawable/, а затем сохранять эти варианты как запись в базе данных. Однако затем мне нужно иметь возможность повторно отображать эти четыре изображения, когда пользователь запрашивает их, и я не уверен, как лучше всего хранить изображения, поскольку моя текущая настройка не будет работать для меня в будущем.

Прямо сейчас у меня это работает, так что я фактически вставляю идентификаторы R.java int в базу данных для каждого из изображений, поэтому в базе данных есть четыре столбца: img1 (int), img2 (int), img3 (int), img4 (инт.). Затем, когда я пишу запрос, я просто использую эти значения вместо R.drawable.someImage.

Это работает нормально. За исключением... когда я добавляю новые изображения в папку res/drawable, все идентификаторы drawable меняются! Тогда id у меня в базе неверные, и некоторые подтягивают не те картинки, а некоторые выбрасывают NullPointerExceptions!

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


person Haley    schedule 28.02.2011    source источник


Ответы (2)


К ресурсам можно получить доступ как к необработанным данным: используйте AssetManager.open(..) Затем вы можете использовать BitmapFactory.decodeStream(..) для создания растрового изображения из потока данных.

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

person Peter Knego    schedule 28.02.2011
comment
Не могли бы вы немного рассказать о том, что делают AssetManager? Я, конечно, посмотрел на API, но почему-то у меня уходит намного больше времени, чем у других программистов, чтобы понять это. По сути, вы говорите, что мне даже не нужны идентификаторы, если я храню изображения в виде необработанных данных и использую AssetManager для доступа к этим данным? Спасибо за вашу помощь! - person Haley; 01.03.2011
comment
AssetManager: предоставляет доступ к необработанным файлам ресурсов приложения. Таким образом, вы можете открыть любой файл ресурсов/активов (растровые изображения, XML) как поток необработанных данных. На практике это полезно только для изображений, как в вашем случае. - person Peter Knego; 01.03.2011
comment
Вам не нужно хранить изображения каким-либо особым образом — просто оставьте их как есть (файлы *.png). Просто дайте AssetManager их имя (например, drawable/image.png), и он вернет поток данных. Это похоже на открытие файла и чтение из него данных. - person Peter Knego; 01.03.2011
comment
Думаю, я знаю, с чем мне сегодня нужно повозиться... спасибо! Вы, ребята, были великолепны. - person Haley; 01.03.2011

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

Я не совсем понимаю это - если вы собираетесь распространять новые изображения «после того, как» пользователи загрузят ваше приложение, то новые изображения никогда не будут иметь идентификаторы ресурсов (как в R.java), поскольку они автоматически генерируются как часть процесса сборки.

Вы действительно это имеете в виду или собираетесь обновить приложение новыми изображениями, чтобы пользователи загружали его снова?

Если вы собираетесь периодически обновлять приложение новыми изображениями и предлагать пользователям загружать обновленное приложение, вы можете найти идентификатор ресурса во время выполнения, используя...

int resId = getResources.getIdentifier("img1", "drawable", "com.mycompany.mypackagename");

На этом этапе, конечно, вам нужно знать имена всех рисунков, хотя этого можно добиться с помощью массива строк в файле res/values/strings.xml.

Однако, если вы хотите добавлять новые изображения без необходимости обновления пользователем приложения, я бы подумал о сохранении каталога изображений (например, на SD-карте). Таким образом, вам просто нужно будет сохранить путь к файлам изображений в БД.

person Squonk    schedule 28.02.2011
comment
Хммм... Я имею в виду, что я собираюсь периодически предоставлять новые пакеты изображений, поэтому я полагаю, что это должно быть в форме обновления. Разве не так обновляются приложения? Только что скачали новую версию? Если нет, пожалуйста, дайте мне знать... это еще одна область Android, которая мне сейчас не очень интересна. Да, и еще я попробовал функцию getIdentifier, и она тоже работает, но я слышал, что такой доступ к ресурсам неэффективен. Хотя, думаю, это мой единственный вариант. Спасибо за Ваш ответ! - person Haley; 01.03.2011
comment
@Haley: Я имел в виду, что новые изображения доступны без обновления приложения, если, например, вы обеспечиваете загрузку изображений со своего веб-сайта, т. Е. Приложение может периодически проверять ваш веб-сайт и уведомлять пользователя о новых изображениях, которые они могут выбрать. скачать. В этом случае они будут «внешними» по отношению к приложению, в отличие от «внутренних» изображений, таких как изображения в res/drawable. Если вы собираетесь использовать их все как «внутренние», то ответ Питера Кнего может быть лучше, чем использование getIdentifier (с точки зрения кода), хотя я сомневаюсь, что это более эффективно. :-) - person Squonk; 01.03.2011
comment
Эй, спасибо! Мое приложение не очень ресурсоемкое, поэтому мне, вероятно, не нужно слишком беспокоиться об эффективности на данном этапе. Я, наверное, просто перемещу изображения в сырой каталог и буду работать с потоками данных... пожелайте мне удачи! - person Haley; 01.03.2011