当前位置: 首页 > 工具软件 > IndexedDB > 使用案例 >

对indexedDB的一些使用方法

邓声
2023-12-01

indexedDB的使用

1. 打开数据库和创建数据仓库

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;
	}
}

2. 新增数据,如果存在就会添加失败

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)
		}
	}
},

3. 索引查询(只能查到对应的数据,只有一条)

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)
	      }
	}
}

4. 获取所有的数据

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)
		}
	}
}

5. 删除数据(根据相同主键进行删除)

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)
		}
	}
}

6. 更新数据

根据已有的信息进行修改,默认根据索引,必须包含主键,如果没有会新增一条

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)
		}
	}
}

7. 关闭数据库

closeDB: function() {
	if (db != null) {
		console.log(db)
		db.close()
		db = null
		console.log('数据库关闭')
	}
}

8. 删除数据库

deleteDB: function(dbName) {
	//数据库名称dbName
	let request = isIndexedDB.deleteDatabase(dbName)
	request.onerror = function(err) {
		console.log("删除数据库失败", err)
	}
	request.onsuccess = function(success) {
		console.log("删除数据库成功", success)
	}
},

9. 根据索引游标进行 模糊搜索

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)
}

10. 排序去重

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))
},
 类似资料: