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

Android平台@capacitor-community/sqlite查询Blob列异常问题

问题解决方法

原因分析

  1. SQLite没有内置BASE64()函数,直接在查询语句中调用会触发编译错误。
  2. @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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:12:44