什么是IndexedDB:Web离线数据库入门简介及基础教程


发布者 kris  发布时间 1416813449763
关键字 JS学习  前端 

IndexedDB是什么


简单来说IndexedDB是HTML5引入的一种可以在Web浏览器使用的数据库,用来持久化大量数据。它可以让你的Web应用程序有非常强大的查询能力,并且可以离线工作。IndexedDB的数据操作直接使用JS脚本,不依赖SQL语句(最初的Web SQL数据库己被废弃),操作返回均采用异步。

下文来自: IndexedDB 规范

客户端需要存储大量局部对象,以便满足Web应用程序对离线数据的要求。 [WEBSTORAGE]可以用来储存键值对(key-value pair)。然而,它无法提供按顺序检索键,高性能地按值查询,或存储重复的一个键。

本规范提供了一些具体的API来实施高级键值数据库,这是最复杂的查询处理器的核心。它通过传统数据库来存储密钥和相应的值(每个键可以对应多个值),并提供通过确定的顺序对值进行遍历。通常用于插入或删除的大量数据,以及持久化有序数据结构。

数据库初始化和创建索引


当创建的library数据库之前并不存在时,会调用onupgradeneeded接口,在这个函数中可以进行数据库初始化和创建索引;

这里创建了一个名为"library"的数据库及一个名为"books"的数据仓库(ObjectStore相当于表),并填入了一些初始数据。


var db;
var request = indexedDB.open("library");

request.onupgradeneeded = function() {
  // 此数据库此前不存在,进行初始化
  var db = request.result;
  var store = db.createObjectStore("books", {keyPath: "isbn"});
  var titleIndex = store.createIndex("by_title", "title", {unique: true});
  var authorIndex = store.createIndex("by_author", "author");

  // 填入初始值
  store.put({title: "Quarry Memories", author: "Fred", isbn: 123456});
  store.put({title: "Water Buffaloes", author: "Fred", isbn: 234567});
  store.put({title: "Bedrock Nights", author: "Barney", isbn: 345678});
};

request.onsuccess = function() {
  db = request.result;
};


数据存储及事务的使用


下面的例子使用事务(transaction)来填入数据:

var tx = db.transaction("books", "readwrite");
var store = tx.objectStore("books");

store.put({title: "Quarry Memories", author: "Fred", isbn: 123456});
store.put({title: "Water Buffaloes", author: "Fred", isbn: 234567});
store.put({title: "Bedrock Nights", author: "Barney", isbn: 345678});

tx.oncomplete = function() {
  // All requests have succeeded and the transaction has committed.
};


数据查询:索引


下面的例子使用索引来查询其中的一本书。

var tx = db.transaction("books", "readonly");
var store = tx.objectStore("books");
var index = store.index("by_title");

var request = index.get("Bedrock Nights");
request.onsuccess = function() {
  var matching = request.result;
  if (matching !== undefined) {
    // A match was found.
    console.log(matching.isbn, matching.title, matching.author);
  } else {
    // No match was found.
    console.log(null);
  }
};


数据查询:索引与游标(cursor)


下面的例子通过索引和游标来来枚举查询到的所有匹配的书

var tx = db.transaction("books", "readonly");
var store = tx.objectStore("books");
var index = store.index("by_author");

var request = index.openCursor(IDBKeyRange.only("Fred"));
request.onsuccess = function() {
  var cursor = request.result;
  if (cursor) {
    // Called for each matching record.
    console.log(cursor.value.isbn, cursor.value.title, cursor.value.author);
    cursor.continue();
  } else {
    // No more matching records.
    console.log(null);
  }
};