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

qkf9rpyu  于 2023-09-28  发布在  IndexedDB
关注(0)|答案(1)|浏览(229)

我试过为flutter web实现Hive,但发现它不提供添加索引。底层的indexedDb提供了添加index,但Hive没有提供(至少我找不到任何示例或文档)
我试图实现idb_shim,它有官方文档为数据库添加索引。
当我尝试使用idb_shimdart object添加到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字符串中?在这种情况下,索引可能不起作用?
o2rvlv0m

o2rvlv0m1#

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

是否需要使用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中来克服这个问题。这里prop1prop2prop3是索引。

阅读数据

在阅读数据表单indexedDB时,它采用LinkedListMap的格式,所有属性都可以读取为map属性。因此,创建一个像下面这样的helper函数会很有帮助:

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
    )};
  }

相关问题