我正在寻找一个使用sqflite在Blob列中存储通用Dart对象(通常为List<MyObject>
)的示例(并取回它),假设它将以二进制数据存储。
MyObject是我的应用程序使用的对象,这里的内容并不重要,因为我正在寻找通用/通用方法。
有人能提供一个摘要吗?
Dart很少提供有关此主题的文档。我能找到的最接近的对象包括将对象编组为Uint8List something like this或something like that,但我无法真正理解/应用它们。
我发现this similar issue,开发人员最终将其列表转换为字符串...我们真的不能做得更好(即效率更高)吗?
非常感谢您的帮助。
帕特里克
答案 0 :(得分:0)
您需要使用 BytesBuilder() 将 MyObject 转换为序列化的字节流,然后作为 Uint8List 插入 sqflite BLOB。 对于列表,有几种策略:
通常,第二个选项更健壮和灵活。示例:
MyList = getTheListOfMyObject();
final bytes = BytesBuilder();
for(int i = 0; i < myList.length; i++) {
bytes.addByte(sizeOfMyObject[i]);
// Here starts the serialization of MyObject
// only you know how it is structured, but
// every member could be expressed as series of bytes
// and remember to think on how to deserialize them
// in order to recover MyObject from the sqflite BLOB
bytes.addByte(firstByteOfMyObject[i]);
bytes.addByte(secondByteOfMyObject[i]);
bytes.addByte(thirdByteOfMyObject[i]);
// and so on.
}
// Then retrieve the full stream as a Uint8List:
final blob = bytes.toBytes();
Map<String, dynamic> map = {
'id': 1,
'my_list': blob,
};
res = await _db.insert("my_table", map);
示例表:“CREATE TABLE my_table(id INTEGER, my_list BLOB)”
在 MyObject 类内部实现 MyObject 的序列化/反序列化是一种更好的编码实践。数据库例程应在存储之前从 getter 中检索 Uint8List,并将字节传递给该类的 setter 以重建对象结构。这样你就可以正确封装对象的实现细节。