有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java字节[]数组在输入SQLITE数据库之前和之后都会发生变化

为什么两个字节数组不同?如何保留原始字节数组而不进行更改

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

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

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

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

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

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

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

日志的结果是

V/byte Array after db: [B@42919440

在您询问之前,SQLITE数据库中只有一个图像,因为我已清除它并重试


共 (3) 个答案

  1. # 1 楼答案

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

    Java是一种传递值语言

    为保留图像数据而创建的byte[]对象引用与用于接收的byte[]对象引用明显不同。打印的是散列,而不是实际的字节数组。如果你看字节数组,它们应该是相同的

  2. # 2 楼答案

    已修复

    问题在于

    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(string)插入它

  3. # 3 楼答案

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

        public static Bitmap convertImageByteToBitmap(byte[] byteImage) {
    
           if (byteImage == null) {
            return null;
           } else {
            ByteArrayInputStream imageStream = new ByteArrayInputStream(byteImage);
            Bitmap imageBitmap = BitmapFactory.decodeStream(imageStream);
    
            return imageBitmap;
        }
    }