Как передать из сервиса картинку в формате BLOB поля БД в ImageView android устройства?

Здравствуйте.
Делаю следующее приложение:
Есть некая SQlite бд на сервере, в ней есть таблица, а в поле таблицы лежит картинка(код ниже):
CREATE TABLE test (rowid INTEGER PRIMARY KEY AUTOINCREMENT, num1 REAL, num2 REAL, num3 REAL, num4 REAL, picture BLOB);
INSERT INTO test (num1, num2, num3, num4, picture) VALUES(1.1, 1.2, 1.3, 1.4, readfile('download.png'));

На сервере стоит Tomcat, который через сервис выбирает эту картинку из БД и отдает в формате Json:
private JSONArray getDbDataInJsonArrayFormat() {
        String sql = "SELECT rowid, num1, num2, num3, num4, picture FROM test";

        try (Connection conn = this.connect();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {

            JSONArray jsonResult = new JSONArray();

            while (rs.next()) {
                JSONObject jsonRow = new JSONObject();
                jsonRow.accumulate("picture", rs.getString("picture"));
                jsonResult.put(jsonRow);
            }
            return jsonResult;
        } catch (SQLException e) {
            LOG.error(e.getMessage());
            return null;
        }
    }

Android подключается к сервису, качает Json, кладет картинку в свою БД:
try {
            db.beginTransaction();

            for (int i = 0; i < response.length(); i++) {
                JSONObject jsonRow = response.getJSONObject(i);

                String picture = jsonRow.getString("picture");
                ContentValues values = new ContentValues();
                values.put(Test.PICTURE, picture);

                db.insert(TEST, null, values);
            }

            db.setTransactionSuccessful();
        } catch (Exception e) {
            Log.w("Error: ", e);
        } finally {
            db.endTransaction();
        }


Потом я делаю выборку строки из БД, пытаюсь сформировать BLOB, но ничего не получается:
public Cursor getAllDataFromTestTable() {
        SQLiteDatabase db = mDbOpenHelper.getWritableDatabase();
        String table =  TEST;
        
        Cursor c = db.query(table, null,
                null, null, null, null, null);
        if (c != null) {
            c.moveToFirst();
        }
        return c;
    }

public static List<ContentValues> getResultStringListAndClose(Cursor c) {
        final List<ContentValues> resultStringList = getAllDataFromDB(c);
        closeCursor(c);
        return resultStringList;
    }

private void onDataLoadedFromDb(Cursor c) {
    List<ContentValues> resList = DbUtils.getResultStringListAndClose(c);

    for (int i = 0; i < resList.size(); ++i) {
        ContentValues rowValues = resList.get(i);


        // picture
        ImageView picture = new ImageView(this);
        byte[] encodeByte = rowValues.getAsByteArray(DbContract.Test.PICTURE);
        Bitmap bitmap = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
        picture.setImageBitmap(Bitmap.createScaledBitmap(bitmap, picture.getWidth(),
               picture.getHeight(), false));

    }
}

Переменная bitmap оказывается равна null.
Подскажите, пожалуйста, в чем тут ошибка или как правильно сделать мою задачу?
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Всё это хрень. Не храни картинки в бд. Храни файлы и пути к ним. Тем более на Андроиде, размер курсора ограничен, и подгрузки на мейнтреде будут, а значит - тормоза. Отдавай в джсоне тоже пути. Грузи в Андроиде с помощью специальных либ. Glide, picasso, fresco, типа того.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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