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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:42:23