图片未正确保存到数据库中(如BLOB)

时间:2011-03-27 16:20:39

标签: android database sqlite blob image

我尝试将图片作为BLOB保存到数据库中,但它没有正确存储在数据库中。

传递的byte []是正确的,有4300个字符,在数据库中只有12个字符。 这就是存储在DB中的内容:[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;
        }
}

我的问题是为什么数据库中存储的字节[]不正确或我该怎么做? 如果您需要更多信息或代码,请告诉我。

THX kirbby

2 个答案:

答案 0 :(得分:1)

使用此代码将图像转换为可以存储为BLOB的ByteArray:

    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);
   }

确保在执行“create table”SQL语句时将数据库定义为BLOB。

答案 1 :(得分:0)

哎呀,看起来你正试图将byte []数组传递给字符串。

出于多种原因(安全性和性能),以这种方式组装SQL字符串是一个非常糟糕的主意。

有关预准备语句的这两个问题,以及如何将值绑定到语句而不必连接SQL:

insert a picture into database(sqlite) with java code. what should i do?

Java Exception Error - Sqlite preparedStatement.setBlob