因此,当我尝试从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;
}
我做错了什么?
答案 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实用程序,这些将允许您检查数据库和表。