IndexedDB

现在的大部分浏览器都支持IndexedDB作为内置数据库,IndexedDB和WebSQL不同,它并不使用SQL语言,而是类似MongoDB这样的NoSQL,IndexedDB能够存储的是JavaScript对象。

创建数据库

创建数据库使用indexedDB.open(name, version),第一个参数是数据库名,第二个参数(可选参数)是版本号,如果指定名字的数据库不存在,就新创建一个。

这个数据库版本的概念和Android是一样的:应用的数据库更新时,版本号提升就能覆盖原来的数据库,达到修改用于客户端应用的数据库结构的目的。

var idbRequest = indexedDB.open('mydb', 1);
idbRequest.onsuccess = function (e) {
    console.log('success');
};
idbRequest.onerror = function (e) {
    console.log('error');
};
idbRequest.onupgradeneeded = function (e) {
    console.log('upgradeneeded');
};

IndexDB数据库操作是异步的,open()函数有三个回调事件:

  • onsuccess:数据库成功打开
  • onerror:数据库打开出错
  • onupgradeneeded:数据库升级成功或数据库创建

注意:浏览器第一次运行上述代码时,会回调onupgradeneededonsuccess,再次刷新就只会回调onsuccess了。

我们可以在chrome的开发者工具中调试IndexedDB。

虽然创建了数据库,但是上面代码并没有创建数据库要存储的数据结构,我们可以在upgradeneeded事件回调中编写。

idbRequest.onupgradeneeded = function (e) {
  var db = e.target.result;
    db.createObjectStore('user', {autoIncrement: true});
  };
  • db.createObjectStore():第一个参数是键名,第二个参数是配置参数,这里我们指定键自增。

添加数据

对IndexedDB的增删改查操作必须通过事务实现,下面是向IndexedDB添加数据的例子:

var idbRequest = indexedDB.open('mydb', 3);
var db;
idbRequest.onsuccess = function (e) {
    db = e.target.result;
    console.log('success');
};
idbRequest.onerror = function (e) {
    console.log('error');
};
idbRequest.onupgradeneeded = function (e) {
    db = e.target.result;
    db.createObjectStore('user', {autoIncrement: true});
};

function addUser() {
    db.transaction(['user'], 'readwrite')
        .objectStore('user')
        .add({username: 'Tom', password: '123456'});
}

删除数据

基本操作同上,只不过使用的函数时objectStore.delete(),参数是数据的主键。

更新数据

使用的函数是objectStore.put(),例子如下:

function updateUser() {
    db.transaction(['user'], 'readwrite')
        .objectStore('user')
        .put({username: 'Tomas', password: '123456'}, 1);
}

put()第一个参数是数据,第二个参数是主键。

查询数据

  • 通过主键查询:通过设置的主键字段查询数据
  • 通过索引查询:为某个字段设置索引,就可以通过该索引查询该字段,否则默认只能通过主键查询
  • 遍历数据:迭代数据库中的数据

通过主键查询数据

function queryUser() {
    var dbRequest = db.transaction(['user'], 'readwrite')
        .objectStore('user')
        .get(1);
    dbRequest.onsuccess = function (e) {
        console.log(dbRequest.result);
    }
}

遍历数据

function iterUser() {
    var dbRequest = db.transaction(['user'], 'readwrite')
        .objectStore('user')
        .openCursor();
    dbRequest.onsuccess = function (e) {
        var cursor = e.target.result;
        if (cursor) {
            console.log(cursor.value);
            cursor.continue();
        }
    }
}

通过索引查询数据

我们首先在原来创建数据库的代码的基础上,添加创建索引的操作:

db
  .createObjectStore('user', {autoIncrement: true})
  .createIndex('username', 'username');

通过索引查询:

function queryUserByIndex() {
    var dbRequest = db.transaction(['user'], 'readwrite')
        .objectStore('user')
        .index('username')
        .get('Tom');
    dbRequest.onsuccess = function (e) {
        console.log(dbRequest.result);
    }
}
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。