我试过为flutter web实现Hive,但发现它不提供添加索引。底层的indexedDb提供了添加index,但Hive没有提供(至少我找不到任何示例或文档)
我试图实现idb_shim,它有官方文档为数据库添加索引。
当我尝试使用idb_shim
将dart 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字符串中?在这种情况下,索引可能不起作用?
1条答案
按热度按时间o2rvlv0m1#
我找到了解决这两个问题的方法:
是否需要使用dart:js包将dart对象转换为JavaScript对象?
是的,我们需要使用以下语法创建不同的对象:
插入到
IndexedDB
时,可以插入对象JsItem()
。是否需要将对象存储为字符串化的JSON字符串?在这种情况下,索引可能不起作用?
我通过将大部分数据(不包括索引属性)转换为
JSON
字符串并插入到bulk_data
中来克服这个问题。这里prop1
,prop2
,prop3
是索引。阅读数据
在阅读数据表单
indexedDB
时,它采用LinkedList
Map的格式,所有属性都可以读取为map
属性。因此,创建一个像下面这样的helper函数会很有帮助: