我尝试为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 对象吗?我已经找到了解决这两个问题的方法:
我们需要使用 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
)};
}