изображение не сохраняется должным образом в базе данных (как BLOB) - PullRequest
1 голос
/ 27 марта 2011

Я пытаюсь сохранить изображение в базе данных в виде большого двоичного объекта, но оно неправильно хранится в базе данных.

Переданный байт [] является правильным и имеет 4300 символов, а в базе данных он содержит всего 12 символов. Вот что хранится в БД: [B @ 43e7be68

Вот код моего SQL_INSERT:

public boolean SQL_INSERT_PICTURE(PictureDatatype type) {
    try{
        this.db = openHelper.getWritableDatabase();
        Log.d(TAG, "Insert picture");
        System.out.println("insert picture");
        db.execSQL("DELETE FROM picture " +
                "where " + LinkPic + " = '" + type.getLink() + "'");
        db.execSQL("INSERT OR REPLACE INTO picture " +
                "( " + NamePic + ", " + LinkPic + ", " + PicturePic + ") " +
                "VALUES ('" + type.getName() + "', '" + type.getLink() +"', '" + 
                type.getPicture() +"')");

        System.out.println("size of the picture (bytearray): " + type.getPicture().length);
        System.out.println("the picture: " + type.getPicture());
        System.out.println("insert complete");
        db.close();
        return true;
    }
        catch(SQLException s){
            System.out.println("Insert failed");
            db.close();
            return false;
        }
}

мой вопрос: почему в БД не хранится правильный байт [] или как я могу это сделать? Если вам нужна дополнительная информация или код, пожалуйста скажите мне.

ТНХ kirbby

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Используйте этот код для преобразования изображения в ByteArray, который может быть сохранен как BLOB:

    private byte[] getBitmapAsByteArray(Bitmap bitmap) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // Middle value is quality, but PNG is lossless, so it's ignored.
        bitmap.compress(CompressFormat.PNG, 0, outputStream);
        return outputStream.toByteArray();
    }

OR

    private byte[] getBitmapAsByteArray(Bitmap bitmap) {
        final int width = bitmap.getWidth();
        final int height = bitmap.getHeight();
        ByteBuffer byteBuffer = ByteBuffer.allocate(width * height * 4);

        bitmap.copyPixelsToBuffer(byteBuffer);
        return byteBuffer.array();
    }

Первый вариант всегда должен работать. Второй вариант предполагает 32 бит на пиксель (формат ARGB_8888), то есть 4 байта. если ваше растровое изображение имеет другой формат (например, 565), оно нуждается в некоторых модификациях.

Когда вы читаете данные изображения из базы данных, сделайте это так:

   public Bitmap loadIcon(long iconId) {
       // Prepare the cursor to read from database....
       byte[] bitmapData = cursor.getBlob(cursor.getColumnIndex(Columns.Icons.DATA));

       return BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length);
   }

Убедитесь, что база данных определена как BLOB при выполнении оператора SQL «создать таблицу».

0 голосов
/ 27 марта 2011

Ой, похоже, вы пытаетесь передать массив байтов [] в строку.

Сборка строк SQL таким способом - очень плохая идея по нескольким причинам (безопасность и производительность).

См. Эти два вопроса для подготовленных операторов и как связать значения с оператором без необходимости конкатенировать ваш SQL:

вставить изображение в базу данных (sqlite) с помощью кода Java,что я должен делать?

Ошибка исключения Java - Sqlite prepareStatement.setBlob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...