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

IndexedDB数据库

漆雕育
2023-12-01

IndexedDB是一种轻量级的nosql数据库,不需要固定的表结构,通常也不存在连接操作。
在浏览器f12下的application下storage下的indexedDB中

indexDB中包含若干个对象仓库,它类似于关系型数据库的表格,对象仓库保存的是数据记录。每条记录类似于关系型数据库的行,但是只有主键和数据体两部分,主键用来建立默认的索引,必须是不同的。主键可以是数据记录里面的一个属性,也可以指定为一个递增的整数编号

不是所有的浏览器都支持indexDB数据库,所以在使用是最好加一个判断操作

if(window.indexedDB){
	//做数据库操作
}

数据库初始化:
创建或打开数据库都使用open方法:

 var req = indexedDB.open(name,version);

其中name是数据库名称的字符串,version是数据库版本号整数,如果省略为当前版本
如果指定的数据库存在,则打开,否则创建数据库。indexDB的操作完全是由异步进行的,每一次indexedDB数据库操作,都需要定义操作在成功或失败的回调函数

if(window.indexedDB){
	var req = indexedDB.open(name,version);
	var db;
	req.onsuccess = function(event){
		db = event.target.result;
	}
	req.onerror = function(error){
		console.log(error.target.errorCode);
	}
	req.onupgradeneeded = function(event){
		db = event.target.result;
	}
}

db代表创建或打开数据库后获得的数据库实例,通过实例可以对数据库作后续操作,onupgradeneeded会在创建数据库或数据库版本号升高之后自动触发,onsuccess是创建或打开数据库成功之后的回调函数,onupradeneeded会在onsuccess之前调用,onerror是打开或者创建失败时的回调函数

新建数据库和打开数据库时同一个操作,但是新建数据库之后的操作在upggradeneeded事件的监听函数里面完成。

对象储存空间:
indexedDB不是关系数据库,它使用对象储存空间(ObjectStore)来储存数据,它类似于关系数据库中的表。一个数据库中可以包含多个对象储存空间,对象储存空间使用键值对的形式来储存数据,即每一个数据都由一组键和一组值组成,值是一个JSON对象。

使用数据库实例对象的createObjectStore方法可以创建对象储存空间,方法如下:

var store = db.createObjectStore(name,optionalParameters);
//name是对象储存空间名字符串,后面的参数可选,代表对象储存空间中键值的选项,是一个json对象配置。
我们可以使用每条记录中的某个指定字段作为键值(keyPath),也可以使用自动生成的递增数字作为键值(keyGenerator),也可以不指定。

object键的选项
键类型			描述
不使用			可以存储任意任意值,但是每添加一条数据的时候需要指定键参数
keyPath			只能储存JavaScript对象,储存对象的一个属性和键值相同
keyGenerator	可储存任意值,当保存新值时,可以自动生成键,相当于自动增长列

数据库实例对象的objectStoreName属性中包含了数据库所有的对象储存空间名,在创建对象储存空间之前,最好先判断要创建的对象储存空间是否存在

req.onupgraadeneeded = function(event){
	db = event.target.result;
	//判断储存空间是否存在,没有就创建
	if(!db.objectStoreNames.contains("test")){
		//创建对象储存空间,键值是属性No
		db.createObjectStore("test",{keyPath:"No"});
	}
}
//数据库新建成功以后,新增一张叫test的表格,主键是no

主键(key)是默认建立索引的属性,比如,数据记录时{id:1.name:‘张三’},那么id属性可以作为主键。
主键也可以指定为下一层对象的属性,比如{ foo: {bar: ‘baz’ }}的foo.bar也可以指定为主键

如果数据记录里面没有合适作为主键的属性,那么可以让indexedDB自动生成主键:

var objectStore = db.createObjectStore(
	'person',
	{ aautoIncrement : true}
);

上面的代码中指定主键为一个递增的整数

索引:
数据库中的索引是一个表(对象储存空间)中所包含的值的列表,当indexedDB数据库需要使用其他属性(非主键)获取数据时,就要预先创建索引,然后使用索引获取数据

新建对象仓库之后,下一步可以新建索引。

req.onupgradeneeded = function(event){
	db = event.target.result;
	var objectStore = db.createObjectStore('person',{ keyPath : 'id'});
	objectStore.createIndex('name','name',{ unique:false });
	objectStore.createIndex('emaail','email',{ unique:true });
}

objectStore.createIndex()的三个参数分别为索引的名称、索引所在的属性、配置对象(该属性是否重复)

新增数据:
新增数据指的是向对象仓库写入数据记录。这需要通过事物完成

function aad(){
	//新建事物
	var req = db.transaction(['person'],'readwwrite')
		.objectStore('person')
		.add({id:1,name:'张三',age:24,email:'zhangsna@example.com'});
	
	req.onsuccess = function(event){
		console.log('数据写入成功');
	}
	
	req.onerror = function(event){
		console.log('数据写入失败');
	}
}

add();

写入数据时需要新建一个事物。新建时必须指定表格名称和操作模式(只读或者读写)。
新建事物以后,通过db.transaction.objectStore方法拿到ObjectStore对象,再通过表格对象的add方法,向表格写入一条记录

写入是一个异步操作,通过监听连接对象的success事件和error事件,了解是否写入成功

读取数据:
读取数据也是通过事物完成

function read(){
	var transaction = db.transaction(['person']);
	var objectStore = transaction.objectStore('person');
	var request = objectStore.get(1);
	request.onerroe = function(event){
		console.log('事物失败');
	}
	request.onsuccess = function(event){
		if(request.result){
			console.log(request.result.name);
			console.log(request.result.age);
			console.log(request.result.email);
		}
		else{
			console.log('未获得数据记录');
		}
	}
}

objectStore.get()方法用于读取数据,参数是主键的值

遍历数据:
遍历数据表格的所有记录,要使用指针对象cursor

function readAll(){
	var objectStore = db.transaction('person').objectStore('person');
	objectStore.openCursor().onsuccess = function(event){
		var cursor = event.taarget.result;
		if(cursor){
			console.log(cursor.key);
			console.log(cursor.vlue.name);
			console.log(cursor.vlue.age);
			console.log(cursor.vlue.email);
			cursor.continue();
		}
		else{
			console.log('没有数据');
		}
	}
}
readAll();

新建指针对象的openCursor()方法是一个异步操作,所以要监听success事件

更新数据:

function update(){
	var request = db.transaction(['person'],'readwrite')
		.objectStore('person')
		.put({ id:1,name:'李四',age:35,email:'lisi@example.com' });
	request.onsuccess = function(event){
		console.log('数据更新失败');
	}
}
update();

put()方法字段更新了主键为1的记录

删除数据:

function remove(){
	var request = db.transaction(['person'],'readwrite')
		.objectStore('person')
		.delete(1);
	request.onsuccess = function(event){
		console.log('数据删除成功');
	}
}
remove();

使用索引:
索引的意义在于,可以让你搜索任意字段,也就是说从任意字段拿到数据记录,如果不建立索引,默认只能搜索主键(从主键取值)

假定新建表格的时候对name字段建立了索引
objectStore.createIndex(‘name’,‘name’,{unique:false});

之后就能从name找到对应的数据记录了

var transaction = db.transactrion(['person'],'readonly');
var store = transaction.objectStore('person');
var index = store.index('name');
var request = index.get('李四');
request.onsuccess = function(e){
	var result = e.target.result;
	if(result){
		console.log(result);
	}
	else{
		console.log('数据不存在');
	}
}

完整增删改查代码:
增加:

if(window.indexedDB){
				var req = indexedDB.open("sql");
				var db;
				req.onsuccess = function(event){
					db = event.target.result;
				}
				req.onerror = function(error){
					console.log(error.target.errorCode);
				}
				req.onupgradeneeded = function(event){
					
					db = event.target.result;
					if(!db.objectStoreNames.contains("test")){
						//创建对象储存空间,键值是属性No
						var objectStore = db.createObjectStore("test",{keyPath:"id"});
					}
					objectStore.transaction.oncomplete = function(event) {
						
						var customerObjectStore = db.transaction("test", "readwrite")
						.objectStore("test")
						.add({ id: "555-55-5555", name: "Donna", age: 32, email: "donna@home.org" });
					
					};	
				}
			}
 类似资料: