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
相关产品推荐
相关产品推荐

