flutter sqlite3 bug 读取字符串,文本 text 变为 Uint8List bolo

具体表现为

使用 Navicat Lite 写入 sqlite3 表中的 text 字段,当内容包含换行符的时候.

使用dart sqlite3库读取到的字段内容是 Uint8List 

使用Navicat Lite导出sql 变为 X'62620D0A' 以X开头的字符串

查询一圈找到原因:

关于sqlite的文本字段插入blob数据_sqlite text blob-CSDN博客

sqlite的文本字段类型为Text,如果对数据库操作时直接在该字段以blob的形式插入数据
(即使是文本数据),也会导致sqlite3_column_type函数获取字段类型时返回blob类型,
导致后续处理失败。

Text字段以blob的形式插入数据:数据HEX字符串,“X”模式插入字段。

基本确定就是 Navicat Lite的bug,不确定 Navicat 其他版本是否有这个bug.

解决方案:

如果无法保证DB文件的来源就只能在 dart上面下手,

方案一  直接判断数据类型 转为String

方案二 直接修改 sqlite3 扩展源码

src\implementation\statement.dart

  Object? _readValue(int index) {
    final type = statement.sqlite3_column_type(index);
    switch (type) {
      case SqlType.SQLITE_INTEGER:
        const hasNativeInts = !identical(0.0, 0);

        if (hasNativeInts) {
          return statement.sqlite3_column_int64(index);
        } else {
          // Wrap in BigInt if needed
          return statement.sqlite3_column_int64OrBigInt(index);
        }

      case SqlType.SQLITE_FLOAT:
        return statement.sqlite3_column_double(index);
      case SqlType.SQLITE_TEXT:
        return statement.sqlite3_column_text(index);
      case SqlType.SQLITE_BLOB:
        return statement.sqlite3_column_bytes(index);
      case SqlType.SQLITE_NULL:
      default:
        return null;
    }
  }

强制 BLOB 返回 String(不过这样就不能正常读取BLOB)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值