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