createDB: function(dbName, version, tableName, key, cursor,callBack) {
// 参数为:dbName数据库名、version版本号、tableName数据仓库名,key主键名、cursor索引名(根据需要可传数组)、callBack回调函数(可用于判断是否新增数据/更新数据)
// 数据库存在则打开,否则创建
var vers = version || 1
let request = isIndexedDB.open(dbName, vers);
/**
* request 并不会返回一个DB对象的句柄,我们得到的是一个IDBOpenDBRequest对象
* 而我们期望得到的DB对象在其result属性中
* 除了 result,IDBOpenDBRequest 接口定义了几个重要属性
* onerror:请求失败的回调函数句柄
* onsuccess:请求成功的回调函数句柄
* onupgradeneeded:请求数据库版本变化句柄
* 第一次打开数据库,会先触发 onupgradeneeded 事件,然后触发success事件。
*/
console.log(request)
// 请求数据库失败的回调函数
request.onerror = function(err) {
console.log(JSON.stringify(err));
console.log('打开数据库失败,错误信息为:', err);
}
//版本更新的时候或者第一次打开数据库的时候
request.onupgradeneeded = function(event) {
console.log('数据库有变化.....')
db = event.target.result
// 判断对象储存空间名称是否存在
if (!db.objectStoreNames.contains(tableName)) {
let objectStore = db.createObjectStore(tableName, {
keyPath: key,
// autoIncrement: true //自动生成主键
});
// unique:true 实际效果:这个索引的内容是唯一的,不能重复,无法创建两个(索引属性值)相同的内容
//其中第一个参数是我们创建的索引名,第二个参数是我们将cursor属性设为索引来进行查询。
for (var i in cursor) {
objectStore.createIndex(cursor[i], cursor[i], {
unique: false
});
}
// objectStore.createIndex('userInfoIndex', cursor, {
// unique: false
// });
console.log("成功创建数据仓库", objectStore)
callBack(true)
}
}
// 请求数据库成功的回调函数
request.onsuccess = function(success) {
console.log(JSON.stringify(success));
console.log('打开数据库成功:', success);
/**
* 获取数据库实例对象,
* db.createObjectStore('table6',{keyPath:'stuId',autoIncrement:true});
* var len = db.objectStoreNames.length; --> 对象储存空间名的个数
* var name = db.objectStoreNames[1]; --> 对象存储空间名
* transaction = db.transaction(['table'],'readwrite'); --> 事务操作的对象存储空间名,事务模式:'readwrite'可读写模式
* // 向info储存空间加入一个info对象,获得request对象用于处理用户对数据库的操作请求
* // 同样拥有 onerror 、onupgradeneeded 、onsuccess 事件
* objectStore = transaction.objectStore('table');
*/
db = success.target.result;
}
}
addDB: function(tableName, data, key, cursor) {
//tableName表名,data数据,
//可不传:key主键,cursor索引
// console.log(db)
if (db != null) {
//添加
let request = db.transaction(tableName, 'readwrite').objectStore(tableName).add(data)
request.onsuccess = function(success) {
console.log("添加成功", success)
}
request.onerror = function(err) {
console.log("添加失败", err)
}
}
},
getIndexedDB: function(tableName, index, data) {
//storeName数据表名,index索引值,以及查找的数据data
//index()是根据索引值查找,如果不加则默认根据主键进行查找
let info = []
if (db != null) {
// console.log(db)
let transaction = db.transaction(tableName, 'readonly')
let request = transaction.objectStore(tableName).index(idnex).getAll(data)
request.onsuccess = function(success) {
console.log("索引查询事务成功", success)
if (request.result) {
for (let i of request.result) {
info.push(i)
}
} else {
console.log('没有数据')
}
}
request.onerror = function(err) {
console.log("索引查询事务失败", err)
}
}
}
getAllData: function(tableName) {
let infoData = []
if (db != null) {
// console.log(db)
let request = db.transaction.objectStore(tableName).objectStore(tableName).getAll()
request.onsuccess = function(success) {
console.log("获取所有数据成功", success)
if (request.result) {
for (var i = 0; i < request.result.length; i++) {
infoData.push(request.result[i])
}
console.log(infoData)
} else {
console.log('没有数据')
}
}
request.onerror = function(err) {
console.log("查询失败", err)
}
}
}
deleteData: function(tableName, index) {
//tableName表名,index主键
let infoData = []
if (db != null) {
// console.log(db)
let request = db.transaction(tableName, 'readwrite').objectStore(tableName).delete(index)
request.onsuccess = function(success) {
console.log("删除成功", success)
if (request.result) {
console.log(request.result)
}
}
request.onerror = function(err) {
console.log("删除失败", err)
}
}
}
根据已有的信息进行修改,默认根据索引,必须包含主键,如果没有会新增一条
updateData: function(tableName, data) {
//tableName表名,data更改的数据
let infoData = []
if (db != null) {
// console.log(db)
let request = db.transaction(tableName, 'readwrite').objectStore(tableName).put(data)
request.onsuccess = function(success) {
console.log("更新事务成功", success)
if (request.result) {
console.log(request.result)
} else {
console.log('暂无数据')
}
}
request.onerror = function(err) {
console.log("更改事务失败", err)
}
}
}
closeDB: function() {
if (db != null) {
console.log(db)
db.close()
db = null
console.log('数据库关闭')
}
}
deleteDB: function(dbName) {
//数据库名称dbName
let request = isIndexedDB.deleteDatabase(dbName)
request.onerror = function(err) {
console.log("删除数据库失败", err)
}
request.onsuccess = function(success) {
console.log("删除数据库成功", success)
}
},
forEachDB: function(tableName, mobile, cursorIndex1, cursorIndex2, callBack) {
//tableName表、mobile要查的电话号或者其他、cursorIndex1索引名、cursorIndex2索引的值(可以是数组)、callBack回调函数
var list = []
let bol = true
if (db != null) {
for (var i in cursorIndex2) {
// console.log(cursorIndex2[i])
let request = db.transaction(tableName, 'readwrite').objectStore(tableName).index(
cursorIndex1).openCursor(IDBKeyRange.only(cursorIndex2[i]))
// console.log(request)
request.onerror = function(err) {
console.log("遍历失败", err)
}
request.onsuccess = function(success) {
// console.log("获取数据库成功", success)
if (request.result) {
let cursor = request.result
console.log(cursor)
bol = cursor.value.contact.indexOf(mobile) > -1
// console.log(bol)
if (bol) {
list.push(cursor.value)
}
cursor.continue()
} else {
// console.log('数据为空')
}
}
}
}
callBack(list)
//可进行排序去重的相关操作
//setTimeout(function() {
//var newArr = indexedDB.listSort(list)
// rconsole.log(newArr)
// callBack(newArr)
//}, 1000)
}
listSort: function(data) {
var list = data
list.sort(function(a, b) {
//对时间进行排序,或者对其他字段进行处理排序,b-a为倒序,a-b为正序
// return Date.parse(b.updateTime.replace(/-/g, "/")) - Date.parse(a.updateTime
// .replace(/-/g,
// "/"));
return b.updateTime - a.updateTime
});
// console.log("排序后",list)
// 去重
const res = new Map()
return list.filter((item) => !res.has(item.contact) && res.set(item.contact, 1))
},