2021-12-10 15:50:32 +08:00

330 lines
9.4 KiB
JavaScript

/**
*
* @param {*} dbName 数据库名称
* @param {*} version 数据库的版本
*/
function openDB(dbName, version = 1) {
return new Promise((resolve, reject) => {
var db; // 存储数据库对象
// 打开数据库,如果没有就是创建操作
var request = indexedDB.open(dbName, version);
// 数据库打开或者创建成功的时候
request.onsuccess = function (event) {
db = event.target.result;
console.log("数据库打开成功");
resolve(db);
}
// 打开失败
request.onerror = function () {
console.log("数据库打开失败");
}
// 数据库发生更新的时候
// 1. 版本号更新 2. 添加或者删除了表(对象仓库)的时候
// 当我们第一次调用 open 方法时,会触发这个事件
// 我们在这里来初始化我们的表
request.onupgradeneeded = function (event) {
console.log("数据库版本更新");
db = event.target.result;
// 创建数据仓库(表)
var objectStore = db.createObjectStore("stu", {
keyPath: "stuId", // 这是主键
autoIncrement: true // 实现自增
});
// 创建索引,有了索引之后,查询速度大大增快(类比新华字典)
objectStore.createIndex("stuId", "stuId", { unique: true });
objectStore.createIndex("stuName", "stuName", { unique: false });
objectStore.createIndex("stuAge", "stuAge", { unique: false });
}
})
}
/**
* 关闭数据库
* @param {object} db 数据库实例
*/
function closeDB(db) {
db.close();
console.log("数据库已关闭");
}
/**
* 删除数据库
* @param {object} dbName 数据库名称
*/
function deleteDBAll(dbName) {
console.log(dbName);
let deleteRequest = window.indexedDB.deleteDatabase(dbName);
deleteRequest.onerror = function (event) {
console.log("删除失败");
};
deleteRequest.onsuccess = function (event) {
console.log("删除成功");
};
}
/**
*
* @param {*} db 数据库实例
* @param {*} storeName 数据仓库实例(表)
* @param {*} data 要添加的数据
*/
function addData(db, storeName, data) {
var request = db.transaction([storeName], "readwrite")
.objectStore(storeName)
.add(data);
request.onsuccess = function () {
console.log("数据写入成功");
}
request.onerror = function () {
console.log("数据写入失败")
}
}
/**
* 通过主键来读取数据
* @param {*} db 数据库实例对象
* @param {*} storeName 数据仓库(表)实例对象
* @param {*} key 主键
*/
function getDataByKey(db, storeName, key) {
return new Promise((resolve, reject) => {
var request = db.transaction([storeName])
.objectStore(storeName)
.get(key);
request.onsuccess = function () {
resolve(request.result)
}
request.onerror = function () {
console.log("数据查询失败");
}
})
}
/**
* 通过主键来读取数据
* @param {*} db 数据库实例对象
* @param {*} storeName 数据仓库(表)实例对象
*/
function getAllData(db, storeName) {
return new Promise((resolve, reject) => {
var request = db.transaction([storeName])
.objectStore(storeName)
.getAll();
request.onsuccess = function () {
resolve(request.result)
}
request.onerror = function () {
console.log("数据查询失败");
}
})
}
/**
* 通过游标(指针)来查询所有的数据
* @param {*} db
* @param {*} storeName
*/
function cursorGetData(db, storeName) {
return new Promise((resolve, reject) => {
var list = []; // 用于存放所有的数据
var request = db.transaction([storeName], "readwrite")
.objectStore(storeName)
.openCursor(); // 创建一个指针(游标)
request.onsuccess = function (event) {
var cursor = event.target.result;
// 查看游标(指针)有没有返回一条数据
if (cursor) {
list.push(cursor.value);
cursor.continue(); // 移动到下一条数据
} else {
resolve(list)
}
}
})
}
/**
* 根据索引来查询数据(只会返回一条)
* @param {*} db
* @param {*} storeName
* @param {*} indexName 索引名称
* @param {*} indexValue 索引值
*/
function getDataByIndex(db, storeName, indexName, indexValue) {
return new Promise((resolve, reject) => {
var request = db.transaction([storeName], "readwrite")
.objectStore(storeName)
.index(indexName)
.get(indexValue);
request.onsuccess = function (event) {
resolve(event.target.result);
}
})
}
/**
* 根据索引和游标来查询数据
* @param {*} db
* @param {*} storeName
* @param {*} indexName 索引名称
* @param {*} indexValue 索引值
*/
function getDataByIndex(db, storeName, indexName, indexValue) {
return new Promise((resolve, reject) => {
var list = []; // 存储所有满足条件的数据
var request = db.transaction([storeName], "readwrite")
.objectStore(storeName)
.index(indexName)
.openCursor(IDBKeyRange.lowerBound(indexValue));
request.onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
list.push(cursor.value);
cursor.continue();
} else {
resolve(list);
}
}
})
}
/**
* 通过索引和游标分页查询记录
* @param {object} db 数据库实例
* @param {string} storeName 仓库名称
* @param {string} indexName 索引名称
* @param {string} indexValue 索引值
* @param {number} page 页码
* @param {number} pageSize 查询条数
*/
function cursorGetDataByIndexAndPage(
db,
storeName,
indexName,
indexValue,
page,
pageSize
) {
return new Promise((resolve, reject) => {
var list = []; // 用于存储当前页的分页数据
var counter = 0; // 创建一个计数器
var isPass = true; // 是否要跳过数据
var request = db.transaction([storeName], "readwrite")
.objectStore(storeName)
.openCursor(); // 创建一个指针(游标)对象(目前是指向第一条数据)
request.onsuccess = function (event) {
var cursor = event.target.result;
// 接下来有一个很重要的判断,判断是否要跳过一些数据
if (page > 1 && isPass) {
isPass = false;
cursor.advance((page - 1) * pageSize); // 跳过数据
return;
}
if (cursor) {
list.push(cursor.value);
counter++;
if (counter < pageSize) {
cursor.continue();
} else {
cursor = null;
resolve(list);
}
} else {
resolve(list)
}
}
})
}
/**
* 更新数据
* @param {object} db 数据库实例
* @param {string} storeName 仓库名称
* @param {object} data 数据
*/
function updateDB(db, storeName, data) {
return new Promise((resolve, reject) => {
var request = db.transaction([storeName], "readwrite")
.objectStore(storeName)
.put(data);
request.onsuccess = function () {
resolve({
status: true,
message: "更新数据成功"
})
}
})
}
/**
* 通过主键删除数据
* @param {object} db 数据库实例
* @param {string} storeName 仓库名称
* @param {object} id 主键值
*/
function deleteDB(db, storeName, id) {
return new Promise((resolve, reject) => {
var request = db
.transaction([storeName], "readwrite")
.objectStore(storeName)
.delete(id);
request.onsuccess = function () {
resolve({
status: true,
message: "删除数据成功"
})
};
request.onerror = function () {
reject({
status: true,
message: "删除数据失败"
})
};
})
}
/**
* 通过索引和游标删除指定的数据
* @param {object} db 数据库实例
* @param {string} storeName 仓库名称
* @param {string} indexName 索引名
* @param {object} indexValue 索引值
*/
function cursorDelete(db, storeName, indexName, indexValue) {
return new Promise((resolve, reject)=>{
var request = db.transaction([storeName], "readwrite")
.objectStore(storeName)
.index(indexName)
.openCursor(IDBKeyRange.only(indexValue));
request.onsuccess = function(event){
var cursor = event.target.result;
if(cursor){
var deleteRequest = cursor.delete();
deleteRequest.onsuccess = function(){
resolve({
status: true,
message: "删除数据成功"
})
}
cursor.continue();
}
}
})
}