HTML5   发布时间:2022-04-25  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了HTML5本地存储——IndexedDB(一:基本使用)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

HTML5本地存储——Web SQL Database提到过Web sql Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了

Web Storage(Local Storage和Session Storage)与IndexedDB。Web Storage使用简单字符串键值对在本地存储数据,方便灵活,但是对于大量结构化数据存储力不从心,IndexedDB是为了能够在客户端存储大量的结构化数据,并且使用索引高效检索的API。

异步API

在IndexedDB大部分操作并不是我们常用的调用方法,返回结果的模式,而是请求——响应的模式,比如打开数据库的操作

var request=window.indexedDB.open('testDB');

这条指令并不会返回一个DB对象的句柄,我们得到的是一个IDBOpenDBrequest对象,而我们希望得到的DB对象在其result属性中,

HTML5本地存储——IndexedDB(一:基本使用)

这条指令请求的响应是一个 IDBDatabase对象,这就是IndexedDB对象,

HTML5本地存储——IndexedDB(一:基本使用)

 

除了result,IDBOpenDBrequest接口定义了几个重要属性

  • onerror: 请求失败的回调函数句柄
  • onsuccess:请求成功的回调函数句柄
  • onupgradeneeded:请求数据库版本变化句柄

所谓异步API是指并不是这条指令执行完毕,我们就可以使用request.result来获取indexedDB对象了,就像使用ajax一样,语句执行完并不代表已经获取到了对象,所以我们一般在其回调函数中处理。

创建数据库

刚才的语句已经展示了如何打开一个indexedDB数据库调用indexedDB.open方法可以创建或者打开一个indexedDB。看一个完整的处理

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

代码中定义了@L_130_9@myDB对象,在创建indexedDB request的成功毁掉函数中,把request获取的DB对象赋值给了myDB的db属性,这样就可以使用myDB.db来访问创建的indexedDB了。

version

我们注意到除了onerror和onsuccess,IDBOpenDBrequest还有一个类似回调函数句柄——onupgradeneeded。这个句柄在我们请求打开的数据库的版本号和已经存在的数据库版本号不一致的时候调用

indexedDB.open()方法还有第二个可选参数,数据库版本号,数据库创建的时候认版本号为1,当我们传入的版本号和数据库当前版本号不一致的时候onupgradeneeded就会被调用,当然我们不能试图打开比当前数据库版本低的version,否则调用的就是onerror了,修改一下刚才例子

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

由于刚才已经创建了版本为1的数据库,打开版本为3的时候,会在控制台输出:DB version changed to 3

关闭删除数据库

关闭数据库可以直接调用数据库对象的close方法

function closeDB(db){ db.close(); }

删除数据库使用indexedDB对象的deleteDatabase方法

function deleteDB(Name){ indexedDB.deleteDatabase(Name); }

简单调用

HTML5本地存储——IndexedDB(一:基本使用)

var myDB={
            name:'test',version:3,db:null
        };
        openDB(myDB.name,myDB.version);
        setTimeout(function(){
            closeDB(myDB.db);
            deleteDB(myDB.Name);
        },500);

HTML5本地存储——IndexedDB(一:基本使用)

由于异步API愿意,不能保证能够在closeDB方法调用获取db对象(实际上获取db对象也比执行一条语句慢得多),所以用了setTimeout延迟了一下。当然我们注意到每个indexedDB实例都有onclose回调函数句柄,用以数据库关闭的时候处理,有兴趣同学可以试试,原理很简单,不演示了。

 

object store

有了数据库后我们自然希望创建一个表用来存储数据,但indexedDB中没有表的概念,而是objectStore,一个数据库中可以包含多个objectStore,objectStore是一个灵活的数据结构,可以存放多种类型数据。也就是说一个objectStore相当于一张表,里面存储的每条数据和一个键相关联。

我们可以使用每条记录中的某个指定字段作为键值(keyPath),也可以使用自动生成的递增数字作为键值(keyGenerator),也可以不指定。选择键的类型不同,objectStore可以存储的数据结构也有差异

键类型 存储数据
不使用 任意值,但是没添加一条数据的时候需要指定键参数
keyPath Javascript对象,对象必须有一属性作为键值
keyGenerator 任意值
都使用 Javascript对象,如果对象中有keyPath指定的属性不生成新的键值,如果没有自动生成递增键值,填充keyPath指定属性

事务

在对新数据库做任何事情之前,需要开始一个事务。事务中需要指定该事务跨越哪些object store。

事务具有三种模式

  1. 只读:read,不能修改数据库数据,可以并发执行
  2. 读写:readwrite,可以进行读写操作
  3. 版本变更:verionchange

 

var transaction=db.transaction([students','taecher']); //打开一个事务,使用students 和teacher object store var objectStore=transaction.objectStore('students'); //获取students object store

给object store添加数据

调用数据库实例的createObjectStore方法可以创建object store,方法有两个参数:store name和键类型。调用store的add方法添加数据。有了上面知识,我们可以向object store内添加数据了

keyPath

因为对新数据的操作都需要在transaction中进行,而transaction又要求指定object store,所以我们只能在创建数据库的时候初始化object store以供后面使用,这正是onupgradeneeded的一个重要作用,修改一下之前代码

function openDB (name,version) { var version=version || 1; var request=window.indexedDB.open(name,version); request.onerror=function(E){ console.log(e.currentTarget.error.messagE); }; request.onsuccess=function(E){ myDB.db=e.target.result; }; request.onupgradeneeded=function(E){ var db=e.target.result; if(!db.objectStorenames.contains('students')){ db.createObjectStore('students',{keyPath:"id"}); } console.log('DB version changed to '+version); }; }
这样在创建数据库的时候我们就为其添加一个名为students的object store,准备一些数据以供添加

var
students=[{ id:1001,name:"Byron",age:24 },{ id:1002,name:"Frank",age:30 },{ id:1003,name:"Aaron",age:26 }];

HTML5本地存储——IndexedDB(一:基本使用)

function addData(db,storeName){ var transaction=db.transaction(storename,'readwrite'); var store=transaction.objectStore(storeName); for(var i=0;i<students.length;i++){ store.add(students[i]); } } openDB(myDB.name,255); line-height:1.5!important">function(){ addData(myDB.db,'students'); },1000);
这样我们就在students object store里添加了三条记录,以id为键,在chrome控制台看看效果

HTML5本地存储——IndexedDB(一:基本使用)

keyGenerate

:10px auto; padding-top:0px; padding-bottom:0px; list-style-type:none; color:rgb(68,{autoIncrement: true}); } console.log('DB version changed to '+version); }; }

HTML5本地存储——IndexedDB(一:基本使用)

剩下的两种方式有兴趣同学可以自己摸索一下了

查找数据

可以调用object store的get方法通过键获取数据,以使用keyPath做键为例

function
getDataByKey(db,storename,value){ var store=transaction.objectStore(storeName); var request=store.get(value); request.onsuccess=function(E){ var student=e.target.result; console.log(student.Name); }; }

HTML5本地存储——IndexedDB(一:基本使用)

更新数据

可以调用object store的put方法更新数据,会自动替换键值相同的记录,达到更新目的,没有相同的则添加,以使用keyPath做键为例

function updateDataByKey(db,255); line-height:1.5!important">var student=e.target.result; student.age=35; store.put(student); }; }
删除数据及object store

调用object store的delete方法根据键值删除记录

function
deleteDataByKey(db,255); line-height:1.5!important">var store=transaction.objectStore(storeName); store.delete(value); }

调用object store的clear方法可以清空object store

function clearObjectStore(db,255); line-height:1.5!important">var store=transaction.objectStore(storeName); store.clear(); }

调用数据库实例的deleteObjectStore方法可以删除一个object store,这个就得在onupgradeneeded里面调用了

if(db.objectStorenames.contains('students')){ db.deleteObjectStore('students'); }

最后

这就是关于indexedDB的基本使用方式,很多同学看了会觉得很鸡肋,和我们正常自己定义个对象使用没什么区别,也就是能保存在本地罢了,这是因为我们还没有介绍indexedDB之所以称为indexed的杀器——索引,这个才是让indexedDB大显神通的东西,下篇我们就来看看这个杀器。

@H_696_371@
本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。

猜你在找的HTML5相关文章

网上看到一片好文,转载保留 高性能 CSS3 动画 尽可能的让动画元素不在文档流中,以减少重排 position:&#160;fixed; position:&#160;absolute; 尽可能多的
//anchorpoints:贝塞尔基点 //pointsamount:生成的点数 //return 路径点的Array function CreateBezierPoints(anchorpoint
h5的28个新特性的详细介绍
分享一个用h5制作的网页版扫雷游戏实例代码
H5 的复制操作实例代码
分享一个vue全局配置的实例代码
分享几个html5冷门小知识
html5web存储实例代码

HTML5本地存储——IndexedDB(一:基本使用)

微信公众号搜 "程序精选"关注
@H_262_760@

大佬总结

以上是大佬教程为你收集整理的HTML5本地存储——IndexedDB(一:基本使用)全部内容,希望文章能够帮你解决HTML5本地存储——IndexedDB(一:基本使用)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。