BitmapFactory.decodeFile传R.drawable报错与SerialBlob标红问题咨询
需求为将图片解码为Bitmap后转换为Blob类型存入SQLite数据库,编写代码后两处出现编辑器报错:R.drawable.fried_chicken 处标红、SerialBlob 处标红。
原实现代码:
// 图片转Bitmap Bitmap src1 = BitmapFactory.decodeFile(R.drawable.fried_chicken); // Bitmap转byte数组 ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); src1.compress(Bitmap.CompressFormat.JPEG,100,baos1); byte[] byte1 = baos1.toByteArray(); // byte数组转Blob Blob blob1 = new SerialBlob(byte1);
R.drawable.fried_chicken与decodeFile适配错误BitmapFactory.decodeFile()方法的入参必须是文件系统的绝对路径字符串,而R.drawable.fried_chicken是Android编译阶段生成的int类型资源ID,二者参数类型、传值逻辑完全不匹配,这是此处报错的核心原因。
要解码drawable目录下的图片资源,应使用BitmapFactory.decodeResource()方法,正确写法如下:// 在Activity、Fragment等持有Context的场景可直接调用getResources() Bitmap src1 = BitmapFactory.decodeResource(getResources(), R.drawable.fried_chicken);若在普通工具类中调用,传入持有的Context实例获取Resources即可:
context.getResources()。SerialBlob报错
该报错和前述R.drawable的错误没有关联。SerialBlob归属java.sql包,报错通常来自两个原因:一是未导入对应依赖包,二是Android原生SQLite API本身不需要SerialBlob类型做二进制数据存取——Android SQLite接口原生支持直接接收byte[]类型写入BLOB字段,强行使用SerialBlob反而容易出现类型适配问题。
实际开发中可以直接跳过SerialBlob转换步骤,拿到图片对应的byte数组后,通过ContentValues直接写入数据库即可,修复后的完整参考代码:// 1. 从drawable资源解码Bitmap Bitmap src1 = BitmapFactory.decodeResource(getResources(), R.drawable.fried_chicken); // 2. 将Bitmap压缩为JPEG格式的byte数组 ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); src1.compress(Bitmap.CompressFormat.JPEG,100,baos1); byte[] imgBytes = baos1.toByteArray(); // 3. 直接写入SQLite数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("img_field", imgBytes); db.insert("target_table", null, values);
开发提示:不建议将大尺寸图片直接以BLOB格式存入SQLite,单条数据大小超过1MB时读写失败概率会明显上升,更合理的实现方案是将图片保存到应用私有存储目录,数据库中仅存储图片对应的本地文件路径。
内容的提问来源于stack exchange,提问作者rob banks

