JavaScript - 本地存储 - indexDB

indexDB

HTML5新增了一种被称为indexDB的数据库,indexDB数据库是一种存储在客户端本地NOSQL数据库

indexDB是一个对象数据库,而不是关系数据库

1、创建(打开)本地数据库

语法

// indexedDB.open("数据库名",版本号);
var request = indexedDB.open("mydb", 1.0);

// onerror 事件表示请求失败 触发的事件
request.onerror = function () {
    console.log('创建或打开数据库失败!');
}

// onsuccess 事件表示请求成功 触发的事件
request.onsuccess = function (e) {
    console.log('创建或打开数据库成功!');

    // e.target.result; 获取的是一个IDBDatabase对象,通过这个对象可以进行增删改查;
    var db = e.target.result;
    console.log(db);
}

2、删除数据库

语法

var request = indexedDB.deleteDatabase("数据库名");

// onerror 事件表示请求失败 触发的事件
request.onerror = function () {
    console.log('删除数据库失败!');
}

// onsuccess 事件表示请求成功 触发的事件
request.onsuccess = function (e) {
    console.log('删除数据库成功!');
}

3、操作数据库

在indexDB中,没有这个概念,而是用对象仓库(Object Store)来代替。

简单理解就是一个对象仓库就是一张表;

3.1 - 创建对象仓库

// 创建或打开本地数据库
// 需要更新版本号触发 onupgradeneeded事件 1.0 -> 2.0
var request = indexedDB.open("myDB", 2.0);

// 失败时触发的事件
request.onerror = function () {
    console.log("创建或打开数据库失败!");
}

// 成功时触发
request.onsuccess = function () {
    console.log("创建或打开数据库成功!");
}

request.onupgradeneeded = function (e) {
    var db = e.target.result;
    
    // 如果数据库中不包含该对象仓库,则创建新的对象仓库
    // db.objectStoreNames.contains("userInfo"); 判断该仓库是否存在
    if (!db.objectStoreNames.contains("userInfo")) {
        	// 创建对象仓库
        	// db.createObjectStore("userInfo", {autoIncrement: true})
        	// {keyPath: 主键名}自定义
		    // {autoIncrement: true}递增的数字
			db.createObjectStore("userInfo", {keyPath: "UID"});
        }
}

3.2 - 增删改查

凡是涉及对象仓库的增删改查,都是使用事务来处理

3.2.1 - 增

使用事务的add()方法,来为对象仓库(ObjectStore)增加数据;

var studentsData = [
    {
        'id': 01,
        'name': 'zs',
        'age': 18
    },
    {
        'id': 02,
        'name': 'ls',
        'age': 16
    },
    {
        'id': 03,
        'name': 'wmz',
        'age': 17
    }
];

// 创建本地数据库
var DBversion = 1.0;
var localDBRequest = indexedDB.open("localDB", DBversion);

// 创建 studentsInfo 对象仓库(ObjectStore)
localDBRequest.addEventListener('upgradeneeded', function (e) {
    var db = e.target.result;

    if (!db.objectStoreNames.contains('studentsInfo')) {
        db.createObjectStore('studentsInfo', {keyPath: 'id'});
    }
});

localDBRequest.addEventListener('error', function () {
    setDBStatus(DBStatus, "数据库创建或连接失败", "error");
});

localDBRequest.addEventListener('success', function (e) {
    setDBStatus(DBStatus, "数据库创建或连接成功", "success");

    var db = e.target.result;
    console.log(db);

    // 开启事务
    var transaction = db.transaction(['studentsInfo'], 'readwrite');
	// 连接对象仓库
    var store = transaction.objectStore('studentsInfo');
    // 添加新数据
    for (var i = 0; i < studentsData.length; i++) {
        var addRequest = store.add(studentsData[i]);
        addRequest.addEventListener('error', function () {
            console.log('添加失败');
        });
        addRequest.addEventListener('success', function () {
            console.log('添加成功');
        });
    }
});

3.2.2 - 删

通过事务的delete()方法来删除对象仓库内的数据

// 基于以上的代码
localDBRequest.addEventListener('success', function (e) {
    setDBStatus(DBStatus, "数据库创建或连接成功", "success");

    var db = e.target.result;

    // 开启事务
    var transaction = db.transaction(['studentsInfo'], 'readwrite');
    // 连接对象仓库
    var store = transaction.objectStore('studentsInfo');
    // 删除数据
    store.delete(01);
});

3.2.3 - 改

localDBRequest.addEventListener('success', function (e) {
    setDBStatus(DBStatus, "数据库创建或连接成功", "success");

    var db = e.target.result;

    // 开启事务
    var transaction = db.transaction(['studentsInfo'], 'readwrite');
    // 连接对象仓库
    var store = transaction.objectStore('studentsInfo');
    // 需要更改的数据
    var changeData = {
        'id': 02,
        'name': 'zs',
        'age': 118
    }
    // 更改数据
    var handleRequest = store.put(changeData);
    handleRequest.addEventListener('error', function () {
        console.log('更改失败');
    });
    handleRequest.addEventListener('success', function () {
        console.log('更改成功');
    });
});

3.2.4 - 查

通过事务的get()方法来查询对象仓库内的数据

// 基于以上的代码
localDBRequest.addEventListener('success', function (e) {
    setDBStatus(DBStatus, "数据库创建或连接成功", "success");

    var db = e.target.result;

    // 开启事务
    var transaction = db.transaction(['studentsInfo'], 'readwrite');
    // 连接对象仓库
    var store = transaction.objectStore('studentsInfo');
    // 查询数据
    var handleRequest = store.get(02);
    handleRequest.addEventListener('error', function () {
        console.log('获取数据失败');
    });
    handleRequest.addEventListener('success', function () {
        this.result == undefined ? console.log('没有此数据') : console.log(this.result);
    });
});

版权声明:本文为weixin_44531811原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。