在 IndexedDB 事务中定义范围

Ido Green

什么是 IndexedDB?

IndexedDB 是一个不断发展的 Web 标准,用于在浏览器中存储大量结构化数据,并使用索引对这些数据进行高性能搜索。换句话说,IndexedDB 是一种对象存储空间。它不同于关系型数据库,后者包含包含集合行和列的表。这是一个重要的基本区别,会影响您设计和构建应用的方式(详见基本概念)。

那么,有什么新变化?

更改,我的朋友们...如果我们不通过简单的语法更改来处理一些更改,就会抛出一些错误。

从版本 17 开始,如果 IndexedDB 事务未限定为对象存储区,Chrome 现在会抛出错误。由于所有数据读写操作都在事务中完成,因此我们需要在数据库上创建事务,指定范围(例如要访问的对象存储区),并确定访问类型(只读或写入)。

在代码中,这意味着什么? 我们可以改为将空数组传递给 database.transaction:

var transaction = db.transaction([], IDBTransaction.READ_ONLY);

您应将范围限定为特定对象存储分区或对象存储分区列表:

// all stores (equivalent to what use to be marked as empty array. )
var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);

// multiple stores:
var transaction = db.transaction(['ObjectStoreName1', 'ObjectStoreName2'],
    IDBTransaction.READ_ONLY);

// single store - these are equivalent
var transaction = db.transaction(['ObjectStoreName'], IDBTransaction.READ_ONLY);
var transaction = db.transaction('ObjectStoreName', IDBTransaction.READ_ONLY);

您可以在事务中使用正确的范围和模式来加快数据访问速度。以下是一些提示:在定义范围时,请仅指定您需要的对象存储区。这样,您就可以同时运行多个具有不重叠作用域的事务。仅在必要时指定 READ_WRITE 事务模式。您可以同时运行多个具有重叠作用域的 READ_ONLY 事务,但一个对象存储区只能有一个 READ_WRITE 事务。

其他来源:

下次再见... 继续将网站推广到附近的地区。