【问题标题】:Storing a List in a Blob with sqflite使用 sqflite 将列表存储在 Blob 中
【发布时间】:2020-04-18 05:08:11
【问题描述】:

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

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

谁能提供一个sn-p?

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

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

非常感谢您的帮助。

帕特里克

【问题讨论】:

  • 我认为最好的选择是转换为 JSON,然后再将 JSON 转换为列表。从一种转换到另一种很容易,反之亦然。
  • 感谢您的快速回答。但是,我想知道与存储为二进制数据相比,这是否是一种有效的解决方案。您对此有何意见?
  • 您找到更好的解决方案了吗?

标签: flutter dart sqflite


【解决方案1】:

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

  • 如果 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 的序列化/反序列化是一种更好的编码实践。数据库例程应在存储 Uint8List 之前从 getter 中检索它,并将字节传递给类的 setter 以重建对象结构。这样您就可以正确封装对象的实现细节。

【讨论】:

    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 2017-02-01
    • 2019-12-19
    • 2020-08-29
    • 1970-01-01
    • 2012-03-02
    • 2016-10-02
    • 2019-08-16
    相关资源
    最近更新 更多