indexDB

186 阅读3分钟

阮一峰教程indexDB

MDN的indexDB

indexDB

1. 打开数据库

var request = window.indexedDB.open("study");
request.onerror = function (event) {
  console.log("数据库打开报错");
};

2. 升级数据库,若库不存在,就创建一个库

unique设为true,值具有唯一性

request.onupgradeneeded = function (event) {
  console.log("数据库升级")
  db = event.target.result;
  if (!db.objectStoreNames.contains("person")) {
    var objectStore = db.createObjectStore("person", { keyPath: "id" });
    objectStore.createIndex("name", "name", { unique: false });
    objectStore.createIndex("email", "email", { unique: true });
  }
};

3. 打开数据库成功,并读取数据库大小

var db;
request.onsuccess = function (event) {
  db = request.result;
  console.log("数据库打开成功");
  let transaction = db.transaction(db.objectStoreNames, "readonly");
  let totalSize = 0;
  let remaining = db.objectStoreNames.length;
  for (let storeName of db.objectStoreNames) {
    let store = transaction.objectStore(storeName);
    let sizeRequest = store.count();
    sizeRequest.onsuccess = function () {
      totalSize += sizeRequest.result * 1024;
      if (--remaining === 0) {
        console.log("indexDB容量大小", totalSize);
      }
    };
    sizeRequest.onerror = function () {};
  }
};

4. 新增数据库中的值 add

新增数据data:{ id: 1, name: '李四', age: 35, email: 'lisi@example.com' }

id需要是唯一的,不能相同

/**
 * 新增数据
 * @param {object} db 数据库实例
 * @param {string} storeName 仓库名称
 * @param {string} data 数据
 */
function addData(db, storeName, data) {
  var request = db
    .transaction([storeName], "readwrite") // 事务对象 指定表格名称和操作模式("只读"或"读写")
    .objectStore(storeName) // 仓库对象
    .add(data);

  request.onsuccess = function (event) {
    console.log("数据写入成功");
  };

  request.onerror = function (event) {
    console.log("数据写入失败");
  };
}

5. 更新数据库的值 put

更新data: 若id已经在库中有了,则是更新这条数据,否则就是新增一条数据

function putData(db, storeName, data) {
  var request = db
    .transaction([storeName], "readwrite") // 事务对象 指定表格名称和操作模式("只读"或"读写")
    .objectStore(storeName) // 仓库对象
    .put(data);

  request.onsuccess = function (event) {
    console.log("数据写入成功");
  };

  request.onerror = function (event) {
    console.log("数据写入失败");
  };
}

6. 获取数据库中的值

key就是创建数据库中的关键字

例如:var objectStore = db.createObjectStore("person", { keyPath: "id" });

此时的key就是id值

function clickReadByKey(key){
  var request = db.transaction(["person"], "readwrite").objectStore("person").get(key);
  request.onerror = function (event) {
    console.log("数据读取失败");
  };
  request.onsuccess = function (event) {
    console.log(request.result);
  };
}

7. 获取数据库中所有值

cursor.continue()是获取下一个值。

function clickRead() {
  var objectStore = db.transaction("person", "readwrite").objectStore("person");
  objectStore.openCursor().onsuccess = function (event) {
    var cursor = event.target.result;
    // console.log(event);
    // console.log(cursor);

    if (cursor) {
      console.log("Id: " + cursor.key);
      console.log("Name: " + cursor.value.name);
      console.log("Age: " + cursor.value.age);
      console.log("Email: " + cursor.value.email);
      cursor.continue();
    } else {
      console.log("没有更多数据了!");
    }
  };
}

8. 通过索引获取到唯一值

创建索引值 objectStore.createIndex("name", "name", { unique: false });

function clickGet(index,indexData) {
  var objectStore = db.transaction("person", "readwrite").objectStore("person");
  var index = objectStore.index(index);
  var request = index.get(indexData);
  request.onsuccess = function (event) {
    console.log(event);
    console.log(request.result);
  };
  request.onerror = function (event) {
    console.log("数据读取失败");
  };
}

9. 删除相关的数据

function clickDeleteByKey(key) {
  var objectStore = db.transaction("person", "readwrite").objectStore("person");
  var request = objectStore.delete(key);
  request.onsuccess = function (event) {
    console.log("数据删除成功");
  };
  request.onerror = function (event) {
    console.log("数据删除失败");
  };
}

10. 删除数据库中所有的数据

  var transaction = db.transaction(["person"], "readwrite");
  var objectStore = transaction.objectStore("person");
  objectStore.clear()

11. 删除相关的数据库

window.indexedDB.deleteDatabase('study');

indexDB和localStorage

  1. 键值对存储:indexDB内部采用对象仓库存放数据。所有类型的数据都可以直接存入。在仓库中,数据以键值对的形式进行保存,每一个数据记录都有对应的主键,且主键是独一无二的,不能有重复。
  2. 异步:indexDB操作时是异步操作,不会导致浏览器卡死,可以同时进行其他操作,localStorage是同步的,若数据量过大,则会影响到网页的性能。
  3. 支持事务:indexDB支持事务,支持在数据库操作失败后,整个事务取消,数据库会回滚到之前的状态,有利于保证数据的安全与完整性。
  4. 同源限制:IndexDB受同源限制,每个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能跨域访问。
  5. 支持二进制储存:IndexDB可以存储json,可以存储字符串,可以存储二进制树。
  6. 存储空间大:indexDB是数据库,所以一般存储量不少于250MB。