我们可以在flutter web中使用dart在indexedDb上建立索引吗?

问题描述 投票:0回答:1

我尝试为flutter web实现Hive,但发现它不提供添加索引。底层的indexedDb提供了添加index,但Hive没有提供(至少我找不到任何示例或文档)

我正在尝试实现idb_shim,它有用于向数据库添加索引的官方文档。

当我尝试使用

dart object
idb_shim
添加到 indexDb 时,它会对某些条目抛出错误
UnimplementedError: structured clone of other type
。以下是要添加的代码

      IdbFactory idbFactory = getIdbFactory();
      _db = await idbFactory.open(boxName,
        version: 1, onUpgradeNeeded: this.onUpgradeNeeded);
      var txn = _db.transaction(boxName, idbModeReadWrite);
      var store = txn.objectStore(boxName);
      await store.put(value, key);
      await txn.completed;

同样,当我尝试读取对象时,它的形式是

ArrayBuffer
而不是JSON对象。没有文档明确说明如何在 indexedDb 中存储/读取
dart objects

      var txn = _db.transaction(boxName, idbModeReadOnly);
      var store = txn.objectStore(boxName);
      final value = await store.getObject(key);
      print(value); // ArrayBuffer

      await txn.completed;
      return value as T; // throws error when converting to actual dart-object
  • 我们需要使用
    dart:js
    包将 dart 对象转换为 Javascript 对象吗?
  • 我们需要将对象存储在字符串化的 JSON 字符串中吗?在这种情况下索引可能不起作用?
flutter dart indexeddb
1个回答
0
投票

我已经找到了解决这两个问题的方法:

我们需要使用 dart:js 包将 dart 对象转换为 Javascript 对象吗?

是的,我们需要使用以下语法创建不同的对象:

import 'package:js/js.dart';

@JS()
@anonymous
abstract class JsItem {
  external bool get prop1;
  external int get prop2;
  external String get prop3;
  external String get bulk_data;

  external factory JsItem({int prop2 = 0, String prop3 = '', String bulk_data = '', bool prop1 = false});
}

插入到

IndexedDB
时,您可以插入对象
JsItem()

我们需要将对象存储在字符串化的 JSON 字符串中吗?在这种情况下索引可能不起作用?

我通过将大部分数据(不包括索引属性)转换为

JSON
字符串并插入到
bulk_data
中克服了这个问题。这里
prop1
prop2
prop3
是索引。

读取数据

在读取数据形式

indexedDB
时,它采用
LinkedList
地图的格式,并且所有属性都可以读取为
map
属性。因此,创建如下所示的辅助函数会很有帮助:

  toDartItem(LinkedMap map){
    return DartItem({ prop1: map["prop1"], 
     prop2: map["prop2"], 
     prop3: map["prop3"], 
     bulk_data: map["bulk_data"], // Convert JSOn to different props as required
    )};
  }
© www.soinside.com 2019 - 2024. All rights reserved.