欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 前端技术 > html >内容正文

html

html5 indexeddb,关于使用html5提供的indexeddb的一下心得 -凯发k8官方网

发布时间:2023/12/14 html 20 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 html5 indexeddb,关于使用html5提供的indexeddb的一下心得 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一:什么是indexeddb?

indexeddb是html5实现本地存储一个小型数据库,并且在chome,ie等主流浏览器已经得到很好的支持,

indexeddb是为了能够在客户端存储大量的结构化数据,并且使用索引高效检索的api。但是这些api的使用很纠结,就是大多数的api全是异步执行。它存储的数据格式是json对象格式,由键值对表示,像这样:

具体操作:f12,找resorce,找indexeddb

二:我使用indexeddb的问题

使用indexeddb的时候会出现很多比较纠结的情况,因为它的很多基本操作都是异步执行的,官方文档说提供的有同步的api,但是直到最后也没有找到,再加上js这种弱类型的语言,刚接触的时候是在让我苦不堪言。特在此总结下我在使用indexeddb时遇到的问题和最终的凯发k8官方网的解决方案,希望有用。

三:基本使用

1,建立数据库:

var mydb={

dbname="testdb",

db=null

}

var request=window.indexeddb.open(mydb.dbname);

解释:这个语句表示打开一个名叫testdb的数据库,如果该数据库不存在,会自动创建一个名为textdb的数据库。这个requese提供三个回调函数,分别是onsuccess(),onerror(),onupgrandeneed(). 这三个函数分别在打开或者创建数据库成功,失败,更新时候调用。

requese.onsuccess=function(e){

console.log("打开数据库成功,db===" e.target.result);

mydb.db=e.target.result;

}

这个地方的e.target.result就是已经打开的数据库对象db,接下来的任何操作都要用到这个db,所以最好把这个代码封装成一个函数,用回调函数的方法,直接返回一个db,以便于后来操作。 同理,onerror方法就是在打开数据库失败的时候调用,可以在onerror函数里打印错误信息,例如:

request.οnerrοr=function(e){

console.log("打开数据库失败,错误信息为:" e.terget.error.message);

}

重要的说一下第三个函数,onupgrandeneed(),这个函数在数据库需要更新的时候调用,比如,第一次创建数据库的时候或者是数据库新添加了objectstore时,(objectstore相当于表的概念)。例如:

request.onupgrandeneed=function(e){

var objectstore=mydb.db.createobjectstore("objectstore1",{keypath:"id"});

var objectstore2=mydb.db.createobjectstore2("objectstore2",{keypath:"id"});

//给objectstore2表加一个索引

objectstore2.creatindex("timeindex","time",{unique:false});

}

解释一下:creatobjectstore()函数,用于建一个objectstore,而objectstore的概念相当于在其他数据库中的表的概念。该函数的两个参数分别为(表名称,主键)。

这里说主键并不准确,但是跟主键的概念很像,请原谅我的简单粗暴。 在这里值得注意的就是:存进去的数据,必须有这个keypath的键,否则会报错,而其他的无所谓,可有可无,看你的需求。如果你要使用索引的话,那么这个索引值得字段也必须有的。

creatindex()函数的三个参数分别是(索引名称,以哪个字段做索引,是否唯一)

2,使用回调函数获取db对象

var mydb={

dbname="testdb",

db=null

}

opendb:function(callback){

var request=window.indexeddb.open(mydb.dbname);

requese.onsuccess=function(e){

console.log("打开数据库成功,db===" e.target.result);

mydb.db=e.target.result;

callback( mydb.db);

}

}

这里的callback是一个函数,当调用opendb方法的时候,需要传进来一个函数作为参数。在onsuccess()函数里,调用callback,把获得到的db对象传给调用opendb的对象。具体使用下边有。

解释一下用这种办法获取db的原因: 因为onsuccess的调用是在打开数据库成功之后,而这个函数是异步调用的,也就是说,你不知道什么时候db是存在的,如果直接return db,得到的会是undefined。而使用js的回调,会很巧妙的避免这个问题。

3,增加一条记录

opendb(function(db){

var transaction=db.transaction("objectstore1","readwrite");

var objectstore=transaction.objectstore("objectstore2");

var value={"id":001,"time":2013.01.02};

var request=objectstore.put(value);

//这个地方也可以用add,跟put的区别是add不会覆盖如果已经存在的数据,而put会覆盖。

request.onsuccess=function(e){

console.log("插入成功");

}

transaction.oncomplete=function(){

console.log("这个时候才是真的插入成功了");

}

});

这个地方有几个微妙的地方

1,定义的value必须有你建立objectstore的时候定义的keypath和索引值

2,transaction.oncomplete字面意思是事务提交,顾名思义,就是在定义的这个事务全部执行完成的时候,才会执行的。只有在这个函数执行之后,再去表里查询这条数据,才会有,否则会查不到,哪怕是在onsuccess执行之后马上查询,也是查询不到的。当初为这个问题纠结很久,这跟传统的关系型数据库相差较大。

3,关于事务的定义,如果需要批量插入数据,事务的定义要定义在循环之外,否则会很大程度的影响插入效率。例如

4,要注意transaction的权限问题,readonly代表只读,readwrite代表读写。 默认是readonly

opendb(function(db){

var transaction=db.transaction("objectstore1","readwrite");

var objectstore=transaction.objectstore("objectstore2");

for(var i=0;i<1000;i ){

var value={"id":i,"time":2013.01.02};

var request=objectstore.put(value);

//这个地方也可以用add,跟put的区别是add不会覆盖如果已经存在的数据,而put会覆盖。

request.onsuccess=function(e){

console.log("插入成功");

}

}

transaction.oncomplete=function(){

console.log("这个时候才是真的插入成功了");

}

});

像这样,把transaction定义在for循环外边,1000条数据会秒插入。当初为了省事,把插入直接封装成一个函数,在这个函数里定义事务,会很慢,十几秒才把1000条数据插入完,慢的我怀疑人生。后来改成把transaction也传进来,但是这会导致transaction失效。会报:this transaction is not activited。

4,删除一条记录

opendb(function(db){

var transaction=db.transaction("objectstore2",'readwrite');

var store=transaction.objectstore("objectstore2");

store.delete(key);

}

});

//简单粗暴,不多解释

###5,修改一条记录

opendb(function(db){

var transaction=db.transaction("objectstore2",'readwrite');

var store=transaction.objectstore("objectstore2");

var request=store.get(key);

request.onsuccess=function(e){

var model=e.target.result;

model.time=2015.09.09;

store.put(model);

};

}

});

//查出来,修改,再放进去覆盖掉。

###5,查询一条记录

按keypath查询

opendb(function(db){

var transaction=db.transaction("objectstore2",'readonly');

var store=transaction.objectstore("objectstore2");

var request=store.get(key);

request.onsuccess=function(e){

var model=e.target.result;

//这个地方最好也用回调函数把查到的值返回回去。方法同opendb()

};

}

});

游标查询全部

opendb(function(db){

var transaction=db.transaction("objectstore2",'readonly');

var array=new array();

var store=transaction.objectstore("objectstore2");

var request=store.opencursor();

request.onsuccess=function(){

var cursor=e.target.result;

if(cursor){

array.push(cursor.value);

cursor.continue();

}else{

// callback(array);

//在这里可以把数组返回回去。同opendb()

//也可以在transaction的oncomplete()中把数组返回回去。

}

}

}

});

未完待补充

总结

以上是凯发k8官方网为你收集整理的html5 indexeddb,关于使用html5提供的indexeddb的一下心得的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图