使用sqflite在Blob中存储列表

时间:2019-12-28 19:19:56

标签: flutter dart sqflite

我正在寻找一个使用sqflite在Blob列中存储通用Dart对象(通常为List<MyObject>)的示例(并取回它),假设它将以二进制数据存储。

MyObject是我的应用程序使用的对象,这里的内容并不重要,因为我正在寻找通用/通用方法。

有人能提供一个摘要吗?

Dart很少提供有关此主题的文档。我能找到的最接近的对象包括将对象编组为Uint8List something like thissomething like that,但我无法真正理解/应用它们。

我发现this similar issue,开发人员最终将其列表转换为字符串...我们真的不能做得更好(即效率更高)吗?

非常感谢您的帮助。

帕特里克

1 个答案:

答案 0 :(得分:0)

您需要使用 BytesBuilder() 将 MyObject 转换为序列化的字节流,然后作为 Uint8List 插入 sqflite BLOB。 对于列表,有几种策略:

  • 如果列表中每个元素的 MyObject 的大小都相同, 一个接一个地存储它们。
  • 如果大小可变,则存储 首先是每个字节的字节数,然后是对象本身, 对列表中的所有元素重复。
  • 或者存储每个 MyObject 后跟一个分隔符。必须选择唯一的分隔符: 任何 MyObject 实例都不得有任何分隔符。

通常,第二个选项更健壮和灵活。示例:

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 以重建对象结构。这样你就可以正确封装对象的实现细节。