如何从SQLite数据库中检索单个图像

时间:2017-10-13 14:46:30

标签: android database sqlite android-sqlite sqliteopenhelper

我可以将图像保存在数据库中。 我现在遇到的问题是检索它并在代码中使用它。

查看我的DATABAse处理程序获取方法:

ImageClass getImage(int state_id) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(DATABASE_TABLE_NAME, new String[]{STATE_ID, STATE_NAME, STATE_IMAGE}, STATE_ID + "=?",
            new String[]{String.valueOf(state_id)}, null, null, null, null);
    if (cursor != null);
    cursor.moveToFirst();

        ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getBlob(1));

        cursor.close();



    return imageClass;
}

查看我在主要活动中使用的代码..

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ImageClass imageClass = db.getImage();
            byte[]in = imageClass._image;
                Bitmap imah = Utils.getImage(in);


                img.setImageBitmap(imah);

            }
        });
    } catch(IOException e) {
        System.out.println(e);
    }
}

这是我的图片活动

public class ImageClass {
int _id;
byte[] _image;
String _state_name;


public ImageClass(){

}

public ImageClass(int state_id,String state_name, byte[] state_image) {
    this._id = state_id;
    this._state_name = state_name;
    this._image = state_image;

}

public ImageClass(String state_name, byte[]state_image){
    this._state_name = state_name;
    this._image = state_image;
}
public ImageClass(int state_id, byte[]state_image){
    this._id = state_id;
    this._image= state_image;
}

public int get_id() {
    return this._id;
}

public void set_id(int state_id) {
    this._id = state_id;
}

public byte[] get_image() {
    return this._image;
}

public void set_image(byte[] state_image) {
    this._image = state_image;
}

public String get_state_name() {
    return this._state_name;
}

public void set_state_name(String set_state_name) {
    this._state_name = set_state_name;
}
从那以后,我真的很沮丧。 在网上尝试了很多东西,但是找不到正确的方法......

1 个答案:

答案 0 :(得分:0)

我相信你的问题是你在检索BLOB时指定偏移量/索引值为1,即你有cursor.getBlob(1),这将从 STATE_NAME 列中检索字节数组 STATE_IMAGE 列。

Cursor的get????()方法的参数是Cursor中列的偏移量/索引。由于STATE_IMAGE是Cursor中的第三列,它的偏移量将是 2 而不是1.因此,以下内容将起作用: -

cursor.getBlob(2)

但是,正如您所发现的,使用偏移很容易导致错误。如果通过游标getColumnIndex方法使用列名,则可能会减少错误并更容易维护代码。使用这个以上将是: -

cursor.getBlob(csr.getColumnIndex(STATE_IMAGE))

我建议改变: -

    ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getBlob(1));

于: -

    ImageClass imageClass = new ImageClass(Integer.parseInt(cursor.getString(cursor.getColumnIndex(STATE_ID)),
            cursor.getString(cursor.getColumnIndex(STATE_NAME)), cursor.getBlob(cursor.getColumnIndex(STATE_IMAGE)));