Flutter/Dart中查询SQLite Blob列返回空结果的问题排查
问题原因及解决方法
1. 十六进制字符串大小写不匹配
SQLite的hex()函数返回的是大写十六进制字符串,但你生成的hashToCheckHex是小写格式。比如数据库中hex(hash)返回A1B2C3,而你的查询参数是a1b2c3,大小写不一致导致匹配失败。
解决方法:
要么生成大写的十六进制字符串,要么将查询条件里的hex(hash)转成小写:
// 方法1:生成大写的十六进制字符串 final String hashToCheckHex = hash.map((byte) => byte.toRadixString(16).padLeft(2, '0').toUpperCase()).join(''); // 方法2:查询时将数据库返回值转小写匹配 database?.query('Books', where: 'lower(hex(hash)) = ?', whereArgs: [hashToCheckHex.toLowerCase()]).then(...);
2. SQLite插件对Blob参数的绑定处理问题
以常用的sqflite插件为例,直接传入Uint8List作为Blob参数时,可能没有被正确识别为Blob类型,导致查询匹配逻辑失效。
解决方法:
使用插件提供的Blob类显式包装参数:
import 'package:sqflite/sqflite.dart'; database?.query('Books', where: 'hash = ?', whereArgs: [Blob(hash)]).then(...);
3. 插入数据时的类型不匹配
如果插入hash时没有以Blob类型存入(比如误转成字符串或其他类型),即使查询时用正确的Uint8List或十六进制字符串,也无法匹配到数据。
验证&解决方法:
检查插入代码,确保hash以Blob类型存入:
// 正确的插入示例(sqflite) await database?.insert( 'Books', {'path': 'xxx', 'hash': Blob(hashUint8List)}, // 部分版本也支持直接传Uint8List );
也可以用SQLite命令行工具直接验证存储值:
SELECT hex(hash) FROM Books WHERE id = 1;
将返回结果和你生成的hashToCheckHex对比,就能确认是否是值本身不匹配的问题。
内容的提问来源于stack exchange,提问作者murphy.z
相关产品推荐
相关产品推荐

