IDBDatabase 对象

打开数据成功以后,可以从IDBOpenDBRequest对象的result属性上面,拿到一个IDBDatabase对象,它表示连接的数据库。后面对数据库的操作,都通过这个对象完成。

  1. var db;
  2. var DBOpenRequest = window.indexedDB.open('demo', 1);
  3. DBOpenRequest.onerror = function (event) {
  4. console.log('Error');
  5. };
  6. DBOpenRequest.onsuccess = function(event) {
  7. db = DBOpenRequest.result;
  8. // ...
  9. };

属性

IDBDatabase 对象有以下属性。

  • IDBDatabase.name:字符串,数据库名称。
  • IDBDatabase.version:整数,数据库版本。数据库第一次创建时,该属性为空字符串。
  • IDBDatabase.objectStoreNames:DOMStringList 对象(字符串的集合),包含当前数据的所有 object store 的名字。
  • IDBDatabase.onabort:指定 abort 事件(事务中止)的监听函数。
  • IDBDatabase.onclose:指定 close 事件(数据库意外关闭)的监听函数。
  • IDBDatabase.onerror:指定 error 事件(访问数据库失败)的监听函数。
  • IDBDatabase.onversionchange:数据库版本变化时触发(发生upgradeneeded事件,或调用indexedDB.deleteDatabase())。

下面是objectStoreNames属性的例子。该属性返回一个 DOMStringList 对象,包含了当前数据库所有对象仓库的名称(即表名),可以使用 DOMStringList 对象的contains方法,检查数据库是否包含某个对象仓库。

  1. if (!db.objectStoreNames.contains('firstOS')) {
  2. db.createObjectStore('firstOS');
  3. }

上面代码先判断某个对象仓库是否存在,如果不存在就创建该对象仓库。

方法

IDBDatabase 对象有以下方法。

  • IDBDatabase.close():关闭数据库连接,实际会等所有事务完成后再关闭。
  • IDBDatabase.createObjectStore():创建存放数据的对象仓库,类似于传统关系型数据库的表格,返回一个 IDBObjectStore 对象。该方法只能在versionchange事件监听函数中调用。
  • IDBDatabase.deleteObjectStore():删除指定的对象仓库。该方法只能在versionchange事件监听函数中调用。
  • IDBDatabase.transaction():返回一个 IDBTransaction 事务对象。

下面是createObjectStore()方法的例子。

  1. var request = window.indexedDB.open('demo', 2);
  2. request.onupgradeneeded = function (event) {
  3. var db = event.target.result;
  4. db.onerror = function(event) {
  5. console.log('error');
  6. };
  7. var objectStore = db.createObjectStore('items');
  8. // ...
  9. };

上面代码创建了一个名为items的对象仓库,如果该对象仓库已经存在,就会抛出一个错误。为了避免出错,需要用到下文的objectStoreNames属性,检查已有哪些对象仓库。

createObjectStore()方法还可以接受第二个对象参数,用来设置对象仓库的属性。

  1. db.createObjectStore('test', { keyPath: 'email' });
  2. db.createObjectStore('test2', { autoIncrement: true });

上面代码中,keyPath属性表示主键(由于主键的值不能重复,所以上例存入之前,必须保证数据的email属性值都是不一样的),默认值为nullautoIncrement属性表示,是否使用自动递增的整数作为主键(第一个数据记录为1,第二个数据记录为2,以此类推),默认为false。一般来说,keyPathautoIncrement属性只要使用一个就够了,如果两个同时使用,表示主键为递增的整数,且对象不得缺少keyPath指定的属性。

下面是deleteObjectStore()方法的例子。

  1. var dbName = 'sampleDB';
  2. var dbVersion = 2;
  3. var request = indexedDB.open(dbName, dbVersion);
  4. request.onupgradeneeded = function(e) {
  5. var db = request.result;
  6. if (e.oldVersion < 1) {
  7. db.createObjectStore('store1');
  8. }
  9. if (e.oldVersion < 2) {
  10. db.deleteObjectStore('store1');
  11. db.createObjectStore('store2');
  12. }
  13. // ...
  14. };

下面是transaction()方法的例子,该方法用于创建一个数据库事务,返回一个 IDBTransaction 对象。向数据库添加数据之前,必须先创建数据库事务。

  1. var t = db.transaction(['items'], 'readwrite');

transaction()方法接受两个参数:第一个参数是一个数组,里面是所涉及的对象仓库,通常是只有一个;第二个参数是一个表示操作类型的字符串。目前,操作类型只有两种:readonly(只读)和readwrite(读写)。添加数据使用readwrite,读取数据使用readonly。第二个参数是可选的,省略时默认为readonly模式。