byte []数组在输入SQLiteDatabase之前和之后变化

时间:2017-04-27 21:43:18

标签: java android arrays sqlite

为什么两个字节数组不同,如何在不更改的情况下保留原始字节数组?

我正在使用Android Camera API拍照,我正在尝试在SQLiteDatabase中存储图像的byte []数据,然后在另一个活动中检索它。 但是,当我按照相机给出的字节数组进行记录时,我得到了..

V/Byte array before db: [B@42a1e7e0

然后我将字节数组(imageData)插入数据库以及其他变量

String insertSQL = "INSERT INTO " + IMAGE_TABLE_NAME +
            " (TIMESTAMP, IMAGEDATA, LAT, LON) VALUES('" + time + "','" + imageData + "','" + lat +"','" + lon +"')";

然后我从Cursor对象(图像)中检索字节数组

byte[] imData = images.getBlob(images.getColumnIndex("IMAGEDATA"));

Log.v("byte Array after db", imData + " ");

日志的结果是

V/byte Array after db: [B@42919440

在你问之前,SQLiteDatabase中只有一个图像,因为我已将其清除并再次尝试。

3 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我,我认为这是一个java基本问题。

Java是一种按值传递的语言,

您创建的byte[]对象引用用于保留图像数据,而您用于接收的byte[]对象引用明显不同。您正在打印哈希而不是实际的字节数组。如果你看一下字节数组,它们应该是相同的

答案 1 :(得分:1)

<强>固定

问题在于

String insertSQL = "INSERT INTO " + IMAGE_TABLE_NAME +
    " (TIMESTAMP, IMAGEDATA, LAT, LON) VALUES('" + time + "','" + imageData + "','" + lat +"','" + lon +"')";

imageData(字节数组)不能以这种方式插入数据库。

我做了这个

dbImages.insert("images", null, createContentValues(imageData));

和函数createContentValues(imageData)

private ContentValues createContentValues(byte[] image) {
    ContentValues cv = new ContentValues();
    cv.put("IMAGEDATA", image);
    return cv;
}

为了将来遇到此问题的任何人保留此信息,请不要使用execSQL(字符串)插入它。

答案 2 :(得分:0)

您正在打印byte []数据而不是真正的位图。你可以通过跟随函数获得真正的位图,你只需要将你的byte []值作为参数传递:

    public static Bitmap convertImageByteToBitmap(byte[] byteImage) {

       if (byteImage == null) {
        return null;
       } else {
        ByteArrayInputStream imageStream = new ByteArrayInputStream(byteImage);
        Bitmap imageBitmap = BitmapFactory.decodeStream(imageStream);

        return imageBitmap;
    }
}