Android - 从SQLite DB收到图像的问题

时间:2017-12-27 01:20:40

标签: java android sqlite

因此,当我尝试从SQLite数据库接收图像时,我得到一个空指针异常。

保存图片:

INSERT INTO $2 \($3\)\r\nselect $4\r\nwhere NOT EXISTS $1

这是我在帮助程序类中接收图像的代码:

    public void insertImage(byte[] imageBytes) {
        ContentValues cv = new ContentValues();
        cv.put(IMAGE, imageBytes);
        mDb.insert(IMAGES_TABLE, null, cv);
    }

以下是我尝试在我的活动中将图像设置为ImageView的方法:

    public byte[] retreiveImageFromDB() {
        Cursor cur = mDb.query(true, IMAGES_TABLE, new String[]{IMAGE,},
                null, null, null, null,
                IMAGE_ID + " DESC", "1");
        if (cur.moveToFirst()) {
            byte[] blob = cur.getBlob(cur.getColumnIndex(IMAGE));
            cur.close();
            return blob;
        }
        cur.close();
        return null;
    }

我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

我做错了什么?

您可能不会检查从retreiveImageFromDB方法返回的null。

而不是: -

    byte[] image = mImage.retreiveImageFromDB();
    Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
    profileImage.setImageBitmap(bitmap);

你应该有以下几点: -

    byte[] image = mImage.retreiveImageFromDB();
    if (image != null) {
        Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
        profileImage.setImageBitmap(bitmap);
    } else {
        // Hanlde null here e.g.
        Toast.makeText(this,"Ooops image is null!!!",Toast.LENGTH_SHORT).show();
    }

然后你可以问为什么光标是空的!

由于查询应返回至少1行(如果存在)(即限制只是图像的唯一性(blob)和返回的行数为1),那么您可能会遇到超出问题的问题从给出的代码中可以确定的范围。

您可以更改insertImage方法以返回插入行的ID,并在调用方法时检查它,例如

public long insertImage(byte[] imageBytes) { // <<<< changed signature
    ContentValues cv = new ContentValues();
    cv.put(IMAGE, imageBytes);
    return mDb.insert(IMAGES_TABLE, null, cv); // added return
}

然后使用类似的东西: -

    if (insertImage(your_image) > 0) {
        Log.d("IMAGEINSERT","Image inserted OK.");
    } else {
        Log.d("IMAGEINSERT","Image was not inserted!!!");
    }

而不是

    insertImage(your_image);

您可以使用提供的at this link实用程序,这些将允许您检查数据库和表。