Java导入java.sql.Blob后无法使用SerialBlob类报错如何解决
问题产生原因
- 资源加载逻辑错误:
R.drawable.fried_chicken是编译期生成的int类型资源ID,通过String.valueOf()转换后得到的是ID对应的数字字符串,并非真实的本地文件路径。BitmapFactory.decodeFile()读取该无效路径会直接返回null,后续调用src.compress()时会先触发空指针异常。 - 类兼容问题:Android平台核心库没有提供
javax.sql.rowset.serial.SerialBlob的实现,即便导入了java.sql.Blob接口,实例化SerialBlob时也会抛出类找不到的运行时错误。本质上Android自带的SQLite数据库走的不是标准JDBC接口,完全不需要使用java.sql.Blob类型存储二进制数据。
修复方案
- 修正Bitmap加载逻辑,使用资源解码方法读取drawable目录下的图片,替换错误的文件路径解码方式。
- 移除
SerialBlob相关的冗余逻辑,Android SQLite直接支持传入byte数组存储二进制数据,不需要额外包装成JDBC的Blob对象。
修复后的可运行代码如下:
// 初始化数据库 db = new MyDBHandler(this); // 正确加载drawable资源为Bitmap对象 Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.fried_chicken); // 将Bitmap压缩为JPEG格式的字节数组 ByteArrayOutputStream baos = new ByteArrayOutputStream(); src.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] imgBytes = baos.toByteArray(); // 字节数组直接存入数据库,不需要转Blob ContentValues values = new ContentValues(); // 替换为你的表中存储图片的字段名 values.put("image_data", imgBytes); // 执行插入操作,替换为你自己的表名 db.getWritableDatabase().insert("food_table", null, values);
注意:不建议将体积较大的图片直接存入SQLite,单条二进制数据超过1MB时会明显拖慢数据库读写速度,大图建议存储到应用私有目录,数据库仅保存对应的文件路径即可。
内容的提问来源于stack exchange,提问作者Kelven Lim
相关产品推荐
相关产品推荐

