You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型存储二进制数据。
修复方案
  1. 修正Bitmap加载逻辑,使用资源解码方法读取drawable目录下的图片,替换错误的文件路径解码方式。
  2. 移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:39:27