Android平台@capacitor-community/sqlite查询Blob列异常问题
问题解决方法
原因分析
- SQLite没有内置BASE64()函数,直接在查询语句中调用会触发编译错误。
- @capacitor-community/sqlite插件在Android端处理Blob列时,将byte数组直接调用默认
toString()方法,导致返回[B@xxx格式的字符串(这是Java中byte数组的默认标识),而非预期的Base64编码内容。
解决方案
方案一:修改插件Java层代码,自动转换Blob为Base64
找到插件的CapacitorSQLitePlugin.java文件中的query()方法,在处理游标数据时,对Blob类型列做Base64编码处理:
// 遍历游标列时的逻辑修改 int colType = cursor.getType(colIndex); if (colType == Cursor.FIELD_TYPE_BLOB) { byte[] blobBytes = cursor.getBlob(colIndex); // 将byte数组转为Base64字符串 String base64Str = android.util.Base64.encodeToString(blobBytes, android.util.Base64.DEFAULT); row.put(colName, base64Str); } else { // 保留其他数据类型的原有处理逻辑 Object value = cursor.getString(colIndex); row.put(colName, value); }
修改后重新编译插件,查询时直接使用SELECT id, name, img FROM teach;即可得到Base64格式的图片字符串。
方案二:前端手动转换(需插件支持传递Uint8Array)
若插件配置允许将Blob转为Uint8Array传递到前端,可在TypeScript中手动编码为Base64:
// 二进制数组转Base64工具函数 const blobToBase64 = (blob: Uint8Array): string => { const binary = String.fromCharCode(...blob); return btoa(binary); }; // 处理查询结果 rows.values.forEach(row => { if (row.img instanceof Uint8Array) { row.img = `data:image/png;base64,${blobToBase64(row.img)}`; } });
注意:当前用户得到的是[B@xxx字符串,说明插件未正确传递二进制数据,此方案仅适用于插件能正常传递Uint8Array的场景。
方案三:注册SQLite自定义BASE64函数
在打开数据库后,执行SQL语句注册自定义BASE64函数,之后即可在查询中使用:
// 在getDb方法的db.open()之后添加 await db.execute(` CREATE TEMP FUNCTION BASE64(x) RETURNS TEXT LANGUAGE JAVA AS 'android.util.Base64.encodeToString(x, android.util.Base64.DEFAULT);' `);
随后查询语句可使用SELECT id, name, BASE64(img) AS img FROM teach;,但需注意:该自定义函数仅在Android端可用,部分SQLite版本可能存在兼容性问题。
内容的提问来源于stack exchange,提问作者vd1
相关产品推荐
相关产品推荐

