indexedDB 对象

浏览器原生提供indexedDB对象,作为开发者的操作接口。

indexedDB.open()

indexedDB.open()方法用于打开数据库。这是一个异步操作,但是会立刻返回一个 IDBOpenDBRequest 对象。

  1. var openRequest = window.indexedDB.open('test', 1);

上面代码表示,打开一个名为test、版本为1的数据库。如果该数据库不存在,则会新建该数据库。

open()方法的第一个参数是数据库名称,格式为字符串,不可省略;第二个参数是数据库版本,是一个大于0的正整数(0将报错),如果该参数大于当前版本,会触发数据库升级。第二个参数可省略,如果数据库已存在,将打开当前版本的数据库;如果数据库不存在,将创建该版本的数据库,默认版本为1

打开数据库是异步操作,通过各种事件通知客户端。下面是有可能触发的4种事件。

  • success:打开成功。
  • error:打开失败。
  • upgradeneeded:第一次打开该数据库,或者数据库版本发生变化。
  • blocked:上一次的数据库连接还未关闭。

第一次打开数据库时,会先触发upgradeneeded事件,然后触发success事件。

根据不同的需要,对上面4种事件监听函数。

  1. var openRequest = indexedDB.open('test', 1);
  2. var db;
  3. openRequest.onupgradeneeded = function (e) {
  4. console.log('Upgrading...');
  5. }
  6. openRequest.onsuccess = function (e) {
  7. console.log('Success!');
  8. db = openRequest.result;
  9. }
  10. openRequest.onerror = function (e) {
  11. console.log('Error');
  12. console.log(e);
  13. }

上面代码有两个地方需要注意。首先,open()方法返回的是一个对象(IDBOpenDBRequest),监听函数就定义在这个对象上面。其次,success事件发生后,从openRequest.result属性可以拿到已经打开的IndexedDB数据库对象。

indexedDB.deleteDatabase()

indexedDB.deleteDatabase()方法用于删除一个数据库,参数为数据库的名字。它会立刻返回一个IDBOpenDBRequest对象,然后对数据库执行异步删除。删除操作的结果会通过事件通知,IDBOpenDBRequest对象可以监听以下事件。

  • success:删除成功
  • error:删除报错
  1. var DBDeleteRequest = window.indexedDB.deleteDatabase('demo');
  2. DBDeleteRequest.onerror = function (event) {
  3. console.log('Error');
  4. };
  5. DBDeleteRequest.onsuccess = function (event) {
  6. console.log('success');
  7. };

调用deleteDatabase()方法以后,当前数据库的其他已经打开的连接都会接收到versionchange事件。

注意,删除不存在的数据库并不会报错。

indexedDB.cmp()

indexedDB.cmp()方法比较两个值是否为 indexedDB 的相同的主键。它返回一个整数,表示比较的结果:0表示相同,1表示第一个主键大于第二个主键,-1表示第一个主键小于第二个主键。

  1. window.indexedDB.cmp(1, 2) // -1

注意,这个方法不能用来比较任意的 JavaScript 值。如果参数是布尔值或对象,它会报错。

  1. window.indexedDB.cmp(1, true) // 报错
  2. window.indexedDB.cmp({}, {}) // 报错