Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
#1

Картинка в SQLite - Программирование Android

24.12.2014, 17:01. Просмотров 1333. Ответов 28
Метки нет (Все метки)

Всем привет!
В программе используется SQLite БД. Заполняю ListView из нее, встал вопрос каким образом хранить и вставлять картинки.
На сей момент имею следующее:
MyCursorAdapter имеет в себе метод:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        if (columnIndex == cursor.getColumnIndex(DataBase.COLUMN_ID)) {
            try {
                InputStream photoStream = mContext.getAssets().open(cursor.getString(columnIndex));
                Bitmap photo = BitmapFactory.decodeStream(photoStream);
                ((ImageView)view).setImageBitmap(photo);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        }
        return false;
    }
Правильно ли я понял что он обращается к файлам Assets, а имя файла забирает из базы, где в нужной колонке у меня просто текст с именем файла (aa.png например)? Или что-то не так я понимаю? Картинки не загружаются, вижу в логах:
Кликните здесь для просмотра всего текста
12-24 16:49:39.732 28476-28476/com.example.myapp E/BitmapFactory﹕ Unable to decode stream: java.io.FileNotFoundException: /aa.png: open failed: ENOENT (No such file or directory)
12-24 16:49:39.732 28476-28476/com.example.myapp I/System.out﹕ resolveUri failed on bad bitmap uri: aa.png


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

Кто сталкивался - прошу помочь. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2014, 17:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Картинка в SQLite (Программирование Android):

Картинка из SQLite в ListView - Программирование Android
Здравствуйте.Есть несколько вопросов. 1 Как отобразить картинки в ListView из SQLite.Если картинки храняться в папке drawable? 2...

SQLite - Программирование Android
Приложение вылетает с ошибкой, не подскажете, в чём проблема? public class DatabaseHelper extends SQLiteOpenHelper { private...

SQLite - Программирование Android
почему id = 0 ??? public void onClick(View view) { dataBase = new DataBase(context); sqLiteDatabase =...

SQLite - Программирование Android
Возвращаясь к старой теме, вернусь к проблеме. По рекомендации попробовал сделать от сюда Тут отправляем данные для записи в бд obj...

SQLite - Программирование Android
Создаю простенькую таблицу. db.execSQL("create table " + DATABASE_TABLE_NAME + " (" + ID_COLUMN + " integer primary key...

SQLite - Программирование Android
Мне не подскажите где можно взять хорошие примеры по SQlite.

28
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
24.12.2014, 20:25 #16
Spelcrawler, аааа, проглядел, аскер туда складывает картинки, использующиеся в процессе разработки...
Каюсь

Кста, а разве /sdcard, синонимом которой есть Environment.getExternalStorageDirectory().getPath() - это флешка?

Добавлено через 1 минуту
Kastaneda,
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
24.12.2014, 20:41 #17
Armagedo, флешка.
0
Armagedo
24.12.2014, 21:05
  #18

Не по теме:

Spelcrawler, чё правда?
А ext_sdcard - это тогда что?

0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
24.12.2014, 21:07 #19
Armagedo, внешняя флешка)
0
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
25.12.2014, 10:01  [ТС] #20
Господа! Всем спасибо за рвение помочь! Но пока не получается ничего!
Смотрите, если я в базу данных записываю просто идентификатор R.drawable.aa
То как правильно мне сделать MyCursorAdapter? Сейчас он вот такой:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MyCursorAdapter extends SimpleCursorAdapter implements ViewBinder {
    private final Context mContext;
 
    @SuppressWarnings("deprecation")
    public MyCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);
        mContext = context;
        //Устанавливаем самого себя в качестве обработчика-ViewBinder'а
        setViewBinder(this);
    }
 
    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        if (columnIndex == cursor.getColumnIndex(DataBase.COLUMN_ID)) {
            try {
                InputStream photoStream = mContext.getAssets().open(cursor.getString(columnIndex));
                Bitmap photo = BitmapFactory.decodeStream(photoStream);
                ((ImageView)view).setImageBitmap(photo);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        }
        return false;
    }
 
}
ListView заполняется следующим образом:
Java
1
2
3
4
5
6
7
8
9
 db = new DataBase(this);
        String[] from = new String[] { DataBase.COLUMN_IMG, DataBase.COLUMN_TXT, DataBase.COLUMN_PRE };
        int[] to = new int[] { R.id.imgIcon, R.id.txtTitle, R.id.pre };
        ListView list = (ListView) findViewById(R.id.listView);
        cursor = db.getList();
        startManagingCursor(cursor);
        myAdapter = new MyCursorAdapter(this, R.layout.listview_item_row, cursor, from, to);
        // присваиваем адаптер списку
        list.setAdapter(myAdapter);
При этом в строке
Java
1
int[] to = new int[] { R.id.imgIcon, R.id.txtTitle, R.id.pre };
R.id.txtTitle и R.id.pre заполняются как положено
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
25.12.2014, 10:29 #21
NOSC,

оставьте стандартный курсорадаптер без вашего вмешательства в его работу - без перегрузки методов, установки биндера и т.д.
Попробуйте

Впрочем
Java
1
((ImageView)view).setImageResource(cursor.getString(columnIndex));
по идее должно бы сработать

И чисто буквоедство...
У вас метод называется setViewValue, т.е. основная завязка логически на View.
А почему проверку условия ведёте по столбцу курсора, а не по идентификатору View.getId()?

Я не говорю, что оно не работает, но как-то не в струе, что ли.
Впрочем...
1
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
25.12.2014, 10:46  [ТС] #22
Цитата Сообщение от Armagedo Посмотреть сообщение
И чисто буквоедство...
У вас метод называется setViewValue, т.е. основная завязка логически на View.
А почему проверку условия ведёте по столбцу курсора, а не по идентификатору View.getId()?
Я не говорю, что оно не работает, но как-то не в струе, что ли.
Этому есть простое объяснение - я г*вно-кодер - самоучка потому что =)))

Цитата Сообщение от Armagedo Посмотреть сообщение
оставьте стандартный курсорадаптер без вашего вмешательства в его работу - без перегрузки методов, установки биндера и т.д.
Попробуйте
Сейчас попробуем

Спасибо

Добавлено через 13 минут
Цитата Сообщение от NOSC Посмотреть сообщение
Сейчас попробуем
Попробовали:
Кликните здесь для просмотра всего текста
12-25 10:38:32.805 14283-14283/com.example.myapp E/SQLiteCursor﹕ requesting column name with table name -- R.drawable.pic
java.lang.Exception
at android.database.sqlite.SQLiteCursor.getColumnIndex(SQLiteCursor.java:171)
at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:301)
at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:333)
at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:81)
at com.example.myapp.MyCursorAdapter.<init>(MyCursorAdapter.java:23)
at com.example.myapp.List.onCreate(List.java:30)
at android.app.Activity.performCreate(Activity.java:5104)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
at android.app.ActivityThread.access$600(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5226)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)
12-25 10:38:32.835 14283-14283/com.example.myapp E/BitmapFactory﹕ Unable to decode stream: java.io.FileNotFoundException: /R.drawable.aa: open failed: ENOENT (No such file or directory)
12-25 10:38:32.845 14283-14283/com.example.myapp I/System.out﹕ resolveUri failed on bad bitmap uri: R.drawable.aa


Ругаемся на at com.example.myapp.MyCursorAdapter.<init>(MyCursorAdapter.java:23):
Java
1
super(context, layout, c, from, to);
Метод выглядит так:
Java
1
2
3
4
5
6
7
8
    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        if (columnIndex == cursor.getColumnIndex(DataBase.COLUMN_ID)) {
            ((ImageView)view).setImageResource(Integer.valueOf(cursor.getString(columnIndex)));
            return true;
        }
        return false;
    }
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
25.12.2014, 11:12 #23
Что вы попробовали?


Java
1
2
3
4
5
6
7
8
9
10
11
SimpleCursorAdapter myAdapter;
 
db = new DataBase(this);
        String[] from = new String[] { DataBase.COLUMN_IMG, DataBase.COLUMN_TXT, DataBase.COLUMN_PRE };
        int[] to = new int[] { R.id.imgIcon, R.id.txtTitle, R.id.pre };
        ListView list = (ListView) findViewById(R.id.listView);
        cursor = db.getList();
        startManagingCursor(cursor);
        myAdapter = new SimpleCursorAdapter(this, R.layout.listview_item_row, cursor, from, to);
        // присваиваем адаптер списку
        list.setAdapter(myAdapter);
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
25.12.2014, 11:18 #24
Цитата Сообщение от NOSC Посмотреть сообщение
((ImageView)view).setImageResource(Integer.valueOf(cursor.getString(columnIndex)));
Вот тут вы пытаетесь строку содержащую путь к ресурсу конвертировать в int. Какое число по вашему должно получится из строки "R.drawable.img"? Нужно получить ид ресурса по пути.
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
25.12.2014, 11:38 #25
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Сообщение от NOSC
((ImageView)view).setImageResource(Integer.valueOf(cursor.getString(columnIndex)));
Вот тут вы пытаетесь строку содержащую путь к ресурсу конвертировать в int.
Кто сказал такое?
R.drawable.img - целое же ж

Ну, достали мы его из базы через жопу, что с того?

Я не знаю, правда, зачем отрабатывать super...

Добавлено через 7 минут
UPD: Впрочем, возможно Spelcrawler прав...кто знает, что хранится в базе - идентификаторы или их наименования
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
25.12.2014, 11:57 #26
Не знаю что там хранится, но достаются строки - cursor.getString(columnIndex)
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
25.12.2014, 12:03 #27
Ну, оно-то так.
Только, что в этой строке - "2130837510" или "R.drawable.directory_icon"?
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
25.12.2014, 12:07 #28
Сам ид (int) лучше не хранить - могут быть проблемы при добавлении/удалении изображений - ид перезапишутся и там где раньше была картинка, скажем круга, может оказаться квадрат.
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
25.12.2014, 12:10 #29
Другой бы спорил.

Но до сих пор непонятно и интересно, справился ли стандартный курсорадаптер с задачей.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2014, 12:10
Привет! Вот еще темы с ответами:

Зашифровать Sqlite - Программирование Android
Привет. Приложение активно работает со своей базой, хранит много данных. Я хотел бы зашифровать все таблицы в моей базе но при этом,...

SQLite и android - Программирование Android
Привет. Вот решил посмотреть, что же такое android. Проконсультируете пожалуйста. 1. На сколько эффективно работает SQLite с 5-10...

SQLite и умножения - Программирование Android
как видите на картинке есть несколько EditText. SQLite создает-заполняет таблицу из шести EditText. как реализовать чтобы при нажатии Далее...

AsyncTask и SQLite - Программирование Android
Здравствуйте! У меня в приложении есть БД SQLite, при нажатие на кнопку загрузки, приложение начинает в базу вносить записи. Структура...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Yandex
Объявления
25.12.2014, 12:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru