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

PostgreSQL UUID数组场景下,如何将_Uint8ArrayView转为List<String>

解决PostgreSQL uuid[]数组转Dart List的问题

postgres:^2.6.1包默认会把PostgreSQL的uuid[]类型以二进制格式返回,所以你拿到的_Uint8ArrayView其实是该数组的二进制表示,需要手动解析成UUID字符串列表。下面提供两种解决方案:

方案一:解析二进制数据

直接处理返回的二进制数组,提取其中的UUID并转换为标准字符串格式:

import 'dart:typed_data';

List<String> uuidArrayFromBinary(Uint8List binary) {
  final result = <String>[];
  if (binary.isEmpty) return result;

  // 跳过PostgreSQL二进制数组的头部信息
  var offset = 0;
  offset += 4; // 跳过版本号(固定为196608)
  // 读取元素个数
  final elementCount = ByteData.sublistView(binary, offset, offset + 4).getUint32(0, Endian.big);
  offset += 4;
  // 读取单个元素的长度(UUID固定为16字节)
  final elementLength = ByteData.sublistView(binary, offset, offset + 4).getUint32(0, Endian.big);
  offset += 4;

  if (elementCount == 0) return result;

  // 逐个解析每个UUID的二进制数据
  for (var i = 0; i < elementCount; i++) {
    final uuidBytes = binary.sublist(offset, offset + elementLength);
    offset += elementLength;
    result.add(_bytesToUuid(uuidBytes));
  }

  return result;
}

// 将16字节的二进制UUID转换为标准字符串格式
String _bytesToUuid(Uint8List bytes) {
  assert(bytes.length == 16, "UUID必须是16字节");
  final hexParts = [
    bytes.sublist(0, 4).map((b) => b.toRadixString(16).padLeft(2, '0')).join(),
    bytes.sublist(4, 6).map((b) => b.toRadixString(16).padLeft(2, '0')).join(),
    bytes.sublist(6, 8).map((b) => b.toRadixString(16).padLeft(2, '0')).join(),
    bytes.sublist(8, 10).map((b) => b.toRadixString(16).padLeft(2, '0')).join(),
    bytes.sublist(10, 16).map((b) => b.toRadixString(16).padLeft(2, '0')).join(),
  ];
  return '${hexParts[0]}-${hexParts[1]}-${hexParts[2]}-${hexParts[3]}-${hexParts[4]}';
}

使用示例:

// 假设从数据库查询结果中拿到的account_ids是_Uint8ArrayView类型
final Uint8List binaryData = accountIds as Uint8List;
final List<String> uuidList = uuidArrayFromBinary(binaryData);

方案二:查询时返回文本格式

如果不想处理二进制,可以在SQL查询时将uuid[]转换为文本格式,再解析字符串:

SQL查询语句

SELECT account_ids::text FROM your_table_name;

Dart解析代码

List<String> parseUuidTextArray(String text) {
  if (text == '{}') return [];
  // 移除数组首尾的大括号
  final innerContent = text.substring(1, text.length - 1);
  if (innerContent.isEmpty) return [];
  // 分割并返回UUID列表
  return innerContent.split(',').map((uuid) => uuid.trim()).toList();
}

使用示例:

// 假设查询返回的account_ids是字符串类型(比如"{aff7e72c-0b4c-47af-b4de-5aecfc723001}")
final String textArray = result['account_ids'];
final List<String> uuidList = parseUuidTextArray(textArray);

内容的提问来源于stack exchange,提问作者ivanesi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:32