Как отобразить фактическое изображение на основе имени файла в базе данных sqlite

У меня есть локальный файл базы данных sqlite, который выглядит примерно так…

_ID | Color_Name | Image_Name  
1   | Red        | red.png  
2   | Blue       | blue.png  
3   | Green      | green.png  
Etc.

Столбец Image_Name базы данных содержит ТОЛЬКО имя файла, а НЕ само изображение. Все изображения хранятся локально в каталоге res/drawable-mdpi.

Цель состоит в том, чтобы иметь список, отображающий название цвета и связанное с ним изображение из базы данных. Например, список будет выглядеть примерно так [знак плюс ниже представляет фактическое изображение .png]…

____________________________________________

Red (text only on this line)  
+ (actual red.png image on this line)  
____________________________________________

Blue (text only on this line)  
+ (actual blue.png image on this line)  
____________________________________________

Etc.  

Я могу отобразить название цвета, но не могу понять, как отобразить само изображение. Соответствующая часть кода для отображения имени приведена ниже…

static class ColorHolder {
    private TextView name=null;

     ColorHolder(View row) {             
        name=(TextView)row.findViewById(R.id.colorName);

        }
           void populateFrom(Cursor c, ColortHelper r) {

               name.setText(r.getName(c)) ;
          }
}

Соответствующая часть файла xml для ОБА имени и изображения приведена ниже…

<TextView 
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|left"
android:id="@+id/colorName"/>

<ImageView
 android:id="@+id/ImageView00"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:src="@drawable/image1" <!--[NOTE: THIS DEFAULT IMAGE FILE SHOULD BE REPLACED ON THE FLY W/THE CORRECT IMAGE FILE FOR EACH RECORD]-->
  >

Ни один из других вопросов, которые я нашел, не помог мне решить эту проблему. Может ли кто-нибудь помочь мне разобраться в этом? Я был бы рад любой помощи, но было бы особенно полезно, если бы вы могли использовать мои ФАКТИЧЕСКИЕ имена файлов / пути / переменные / идентификаторы / и т. д. (которые приведены выше) в своем объяснении, чтобы я мог наиболее легко следовать и понимать ваши отклик. Указание мне на учебные пособия может быть бесполезным, поскольку я уже просмотрел много материала, но не решил эту проблему. Спасибо!


person Dev1345    schedule 23.08.2012    source источник


Ответы (2)


Используйте Resources.getIdentifier(имя строки, String defType, String defPackage)

Также вам не нужно хранить имя изображения ресурса ... просто назовите их так же, как цвет (как вы уже сделали), просто убедитесь, что, как я показываю здесь, они в нижнем регистре

Чтобы использовать ваш пример:

void populateFrom(Cursor c, ColorHelper r) {

    //get the color name from your database (only once)

    String strColor = r.getName(c);

    // set the text on your TextView as before

    TextView clrName = (TextView)findViewById(R.id.ImageView00);
    clrName.setText(strColor);

    // get the resource ID - note "name" without extension

    int resourceID = context.getResources().getIdentifier(strColor.toLower(),
            "drawable", context.getPackageName());

    //get a reference to your imageview and set the image

    ImageView clrImage = (ImageView)findViewById(R.id.ImageView00);
    clrImage.setImageResource(resourceID);

}
person Moog    schedule 23.08.2012
comment
Спасибо. Я попытался подключить это, и оно не будет компилироваться. В нем говорится, что «контекст не может быть разрешен» и «невозможно разрешить изображение» (получил то же сообщение, когда я попробовал imageView). Может быть, я поставил это в неправильном месте? Кроме того, почему имя изображения «красный» должно быть жестко закодировано? Я хотел бы, чтобы это значение извлекалось из столбца базы данных для каждой записи. Кроме того, как это изменит изображение в идентификаторе «ImageView00»? Я должен был где-то подключить «ImageView00»? Пожалуйста помоги. Спасибо! - person Dev1345; 23.08.2012
comment
вам нужно будет сделать это в рамках действия или поставщика контента, чтобы получить контекст. Замените жестко закодированный красный цвет в запросе к таблице. Что касается просмотра изображений, это всего лишь пример... зависит от того, что вы действительно хотите сделать, из вопроса это неясно. Все, что выходит за рамки этого вопроса. Вы не можете просто вырезать и вставлять код, вы никогда не продвинетесь, если не изучите платформу, для которой разрабатываете... developer.android.com - person Moog; 24.08.2012
comment
Спасибо. Я опирался на платформу (пока что у меня есть 2 приложения), но элементы базы данных для меня очень новы, и я все еще нахожусь на ранних стадиях обучения ... и в настоящее время запутался. Я разместил свой код, поэтому подумал, что именно там я должен был добавить ваш (извините за путаницу). Не могли бы вы объяснить, как ImageView00 может получить эти данные с помощью вашего кода? Думаю, это могло бы прояснить для меня некоторые вещи. Другой ответ был ближе в этом вопросе, но операторы if/else для этого не сработали. Спасибо. - person Dev1345; 24.08.2012
comment
Я обновил, но я чувствую, что вы не особо задумываетесь об этом и просите о помощи, потому что это проще, чем пытаться. Я развеял ваши сомнения и предоставил вам обновленную версию примера. Обратите внимание, что я использую название цвета вместо имени изображения, так как они кажутся одинаковыми, но вы можете заменить требуемое значение. Я надеюсь, что это помогает. - person Moog; 24.08.2012
comment
Спасибо. Я думаю, что с тем, что вы предоставили, я смогу понять это. Мне жаль слышать, что вы думаете, что re: «проще, чем печатать». Я могу заверить вас, что я потратил довольно много времени, пытаясь понять это самостоятельно, прежде чем опубликовать свой вопрос. Я не искал легкого пути... просто помогите с путаницей, которую я не смог решить самостоятельно. Прошу прощения, что мое замешательство показалось вам иным. Я действительно ценю, что вы придерживаетесь этого и помогаете мне. Я отмечу ваш ответ и проверю его как ответ. Спасибо еще раз. - person Dev1345; 24.08.2012
comment
Что ж, именно поэтому я дал вам право на сомнение ... иногда, чем больше вы смотрите на это, тем более запутанным все это кажется. Рад, что смог помочь ;) - person Moog; 24.08.2012

Есть несколько способов сделать это. Если бы мне пришлось делать это самому, я бы сохранил изображения в виде BLOB-объектов в базе данных. Простой и простой в использовании. Другой альтернативой является использование if-else if-else if, например:

ImageView imageview = findViewById(R.id.ImageView00);
    if( colorname.equals("Red") )
        imageview.setImageResource(R.drawable.red);
    else if( colorname.equals("Red") )
        imageview.setImageResource(R.drawable.blue);
person Lazy Ninja    schedule 23.08.2012
comment
Спасибо за вашу помощь. Я вижу, как это на самом деле изменит поле ImageView00, но есть сотни записей, так что это может сделать очень длинный if/else stmt. Вместо того, чтобы оценивать поле с помощью if/else stmt, я бы хотел, чтобы он извлек имя файла изображения из базы данных и отобразил это изображение. Знаете ли вы, как я мог это сделать? Любая помощь приветствуется. Спасибо. [P.S. Изображения не сохраняются в БД как Blob. Это файлы в каталоге res/drawable. Несколько записей могут использовать одно и то же изображение, поэтому лучше иметь файл изображения только 1 раз, чем сохранять его несколько раз в БД] - person Dev1345; 23.08.2012
comment
Поскольку у вас более 100 записей, мой ответ отрицательный. Хорошо, другой альтернативой является использование HashMap‹›. Используйте colorsName для ключей и идентификаторы для значений. Затем повторите HashMap‹›, чтобы найти каждый идентификатор, соответствующий имени цвета. ‹br› Кстати, вы можете спроектировать свою базу данных таким образом, что вам нужно будет сохранить изображение только один раз. Просто создал еще одну таблицу для изображений и привязал к ней таблицы для цветов. - person Lazy Ninja; 24.08.2012
comment
Спасибо. Я рассмотрю эту альтернативу как возможность. Кроме того, это отличная идея относительно дизайна базы данных. Я отмечу ваш ответ. Спасибо еще раз! - person Dev1345; 24.08.2012