0

0

html5使用indexdb的代码实例分享(图文)

黄舟

黄舟

发布时间:2017-03-31 11:50:21

|

5572人浏览过

|

来源于php中文网

原创

前面说过html5对于离线应用的支持是很好的,不禁支持localstorage这样在客户端存储一个键值对的方式而且还可以引用manifest文件,将需要缓存的文件在其中定义,其实html5中还可以使用indexdb,又称索引数据库,该数据库可以用来存储离线对象。下面开始:

请求完成后的回调

所有的请求完成之后都会有一个回调,onsuccess 和onerror,其中:onsuccess表示请求成功时候的回调,onerror 表示请求失败时候的回调。同时还可以使用javascript中的 try/catch来捕获异常,在进一步的处理。

使用数据库

一个数据库一次只能有一个版本,初次创建改数据库的时候版本号是0,当我们需要更改已经创建好的数据库时候,就需要更改其版本号,当更改 版本号的时候,会触发upgradeneeded回调,所以修改数据库或者存储对象的方法必须放到upgradeneeded方法中执行。

判断当前浏览器是否支持indexdb

if (!window.indexedDB) {
    window.alert("您的浏览器不支持indexdb");
}<!--这里indexDB是window对象的属性,类似于alert所以window可以省略-->

创建数据库

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
        function createDatabase(indexDbName) {
            //调用 open 方法并传递数据库名称。如果不存在具有指定名称的数据库,则会创建该数据库
            var openRequest = indexedDB.open(indexDbName);            var db;
            openRequest.onerror = function(e) {//当创建数据库失败时候的回调
                console.log("Database error: " + e.target.errorCode);
            };
            openRequest.onsuccess = function(event) {
                console.log("Database created");
                db = openRequest.result;//创建数据库成功时候,将结果给db,此时db就是当前数据库
                //alert("this is :"+db);
            };
            openRequest.onupgradeneeded = function (evt) {//更改数据库,或者存储对象时候在这里处理

            };
        }    </script></head><body>
    <a href="javascript:createDatabase('firstdb')">createDatabase</a></body></html>

上面这段代码可以创建一个数据库到客户端。
这里写图片描述

删除数据库

通过调用 deleteDatabase 方法,并且传入需要删除的数据库名称来删除现有数据库。

立即学习前端免费学习笔记(深入)”;

function deleteDatabase(indexDbName) {
    var deleteDbRequest = indexedDB.deleteDatabase(indexDbName);
    deleteDbRequest.onsuccess = function (event) {
        console.log("detete database success");
    };
    deleteDbRequest.onerror = function (e) {
        console.log("Database error: " + e.target.errorCode);
    };
}

存储数据

objectstore

在indexdb中没有表的概念,而是使用objectstore来存储对象的,一个数据库中可以包含多个objectStore,objectStore是一个灵活的数据结构,可以存放多种类型数据。我们可以使用每条记录中的某个指定字段作为键值(keyPath),也可以使用自动生成的递增数字作为键值(keyGenerator),也可以不指定。选择键的类型不同,objectStore可以存储的数据结构也有差异

事物

更新数据库内容或者插入新的数据时候,需要首先开启到事物,并且需要制定当前事物操作了那些objectstore。

事务具有三种模式

  • 只读:read,不能修改数据库数据,可以并发执行

  • 读写:readwrite,可以进行读写操作

  • 版本变更:verionchange

因为对新数据的操作都需要在transaction中进行,而transaction又要求指定object store,所以我们只能在创建数据库的时候初始化object store以供后面使用。

指定keyid添加数据

指定keyid,可以理解为指定一个主键

//添加数据
        function insertAnObj(indexDbName) {
            var userinfos=[{ 
                                id:1001, 
                                name:"小李", 
                                age:24 
                            },{ 
                                id:1002, 
                                name:"老王", 
                                age:30 
                            },{ 
                                id:1003, 
                                name:"王麻子", 
                                age:26 
                            }];            
                            var openRequest = indexedDB.open(indexDbName,1);
            openRequest.onerror = function(e) {//当创建数据库失败时候的回调
                console.log("Database error: " + e.target.errorCode);
            };
            openRequest.onsuccess = function(event) {
                console.log("Database created");
                db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
                //alert("this is :"+db);
                //打开和userinfo相关的objectstore的事物
                var transaction = db.transaction("userinfo",'readwrite'); 
                var store=transaction.objectStore("userinfo");                
                for(var i=0;i<userinfos.length;i++){                    
                //alert("add"+userinfos[i]);
                    store.add(userinfos[i]);//将对象添加至userinfo相关的objectstore中
                }
            };
            openRequest.onupgradeneeded = function(event) {
               var db = event.target.result;                
               //在第一次创建数据库的时候,就创建userinfo相关的objectstore,以供后面添加数据时候使用
                if(!db.objectStoreNames.contains('userinfo')){                    
                //keyPath:Javascript对象,对象必须有一属性作为键值
                    db.createObjectStore('userinfo',{keyPath:"id"});
                }

            }
}

这里写图片描述

使用autoIncrement添加数据

指定autoIncrement,可以理解为指定了一个主键自动增长。

//指定主键自动增长
        function insertAutoInc(indexDbName) {
            var userinfos=[{ 
                                id:1001, 
                                name:"小李", 
                                age:24 
                            },{ 
                                id:1002, 
                                name:"老王", 
                                age:30 
                            },{ 
                                id:1003, 
                                name:"王麻子", 
                                age:26 
                            }];            
                            var openRequest = indexedDB.open(indexDbName,2);
            openRequest.onerror = function(e) {//当创建数据库失败时候的回调
                console.log("Database error: " + e.target.errorCode);
            };
            openRequest.onsuccess = function(event) {
                console.log("Database created");
                db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
                //alert("this is :"+db);
                //打开和userinfo相关的objectstore的事物
                var transaction = db.transaction("userinfo",'readwrite'); 
                var store=transaction.objectStore("userinfo");                
                for(var i=0;i<userinfos.length;i++){                    
                //alert("add"+userinfos[i]);
                    store.add(userinfos[i]);//将对象添加至userinfo相关的objectstore中
                }
            };
            openRequest.onupgradeneeded = function(event) {
               var db = event.target.result;                
               //在第一次创建数据库的时候,就创建userinfo相关的objectstore,以供后面添加数据时候使用
                if(!db.objectStoreNames.contains('userinfo')){                    
                //keyPath:Javascript对象,对象必须有一属性作为键值
                    db.createObjectStore('userinfo',{autoIncrement: true});
                }
            }
}

这里写图片描述

查找数据

根据id查找数据

之前我们已经添加过了定义key为autoincreament类型方式的数据,现在就可以根据id来查找单条数据了。

function findDbdata(indexDbName,value) {
            var openRequest = indexedDB.open(indexDbName);            
            var db;
            openRequest.onerror = function(e) {//当创建数据库失败时候的回调
                console.log("Database error: " + e.target.errorCode);
            };
            openRequest.onsuccess = function(event) {
                console.log("Database created");
                db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
                var transaction = db.transaction("userinfo",'readwrite');                
                var objectStore = transaction.objectStore("userinfo");                
                //var cursor = objectStore.openCursor();
                var request = objectStore.get(Number(1));//查找i=1的对象,这里使用Number将1转换成数值类型
                request.onsuccess = function(e) {
                    var res = e.target.result; //查找成功时候返回的结果对象
                    console.dir(res);                    
                    if (res) {                        
                    for (var field in res) { //遍历每一个对象属性
                            console.log(field+":"+res[field]);                            
                            // alert(res[field]);
                        };
                    };
                }
            };
            openRequest.onupgradeneeded = function (event) {//更改数据库,或者存储对象时候在这里处理

            };
}

这里写图片描述

方科网络ERP图文店
方科网络ERP图文店

方科网络ERP图文店II版为仿代码站独立研发的网络版ERP销售程序。本本版本为方科网络ERP图文店版的简化版,去除了部分不同用的功能,使得系统更加精炼实用。考虑到图文店的特殊情况,本系统并未制作出入库功能,而是将销售作为重头,使用本系统,可以有效解决大型图文店员工多,换班数量多,订单混杂不清的情况。下单、取件、结算分别记录操作人员,真正做到订单全程跟踪!无限用户级别,不同的用户级别可以设置不同的价

下载

查找所有数据

function findAllDbdata(indexDbName) {
            var openRequest = indexedDB.open(indexDbName);            
            var db;
            openRequest.onsuccess = function(event) {
                console.log("Database created");
                db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
                var transaction = db.transaction("userinfo",'readonly');                
                var objectStore = transaction.objectStore("userinfo");                
                var cursor = objectStore.openCursor();
                cursor.onsuccess = function(e) { 
                    var res = e.target.result; 
                    if(res) { 
                        console.log("Key", res.key); 
                        var request = objectStore.get(Number(res.key));//根据查找出来的id,再次逐个查找
                        request.onsuccess = function(e) {
                            var res = e.target.result; //查找成功时候返回的结果对象
                            //console.dir(res);
                            if (res) {                                
                            for (var field in res) { //遍历每一个对象属性
                                    console.log(field+":"+res[field]);                      
                                    // alert(res[field]);
                                };
                            };
                        }
                        res.continue(); 
                    } 
                }   
            };
        }

这里写图片描述

根据id删除数据

删除跟引用0一样,需要创建事务,然后调用删除引用1delete来删除数据

function deleteDataById(indexDbName) {
            var openRequest = indexedDB.open(indexDbName);            
            var db;
            openRequest.onsuccess = function(event) {
                db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
                var transaction = db.transaction("userinfo",'readwrite');                
                var objectStore = transaction.objectStore("userinfo");                
                var request = objectStore.delete(Number(2));//根据查找出来的id,再次逐个查找
                request.onsuccess = function(e) {
                    console.log("delete success");
                }
            }
        }

删除所有数据

通过objectstore.clear()删除所有的数据。

function deleteAllData(indexDbName) {
            var openRequest = indexedDB.open(indexDbName);            
            var db;
            openRequest.onsuccess = function(event) {
                db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
                var transaction = db.transaction("userinfo",'readwrite');                
                var objectStore = transaction.objectStore("userinfo");
                objectStore.clear();
            }   
        }

创建索引

我们可以在创建object store的时候指明索引,使用object store的createIndex创建索引,方法有三个参数

  • 索引名称

  • 索引属性字段名

  • 索引属性值是否唯一
    这里我新创建一个数据库,并且设置基于name和age的索引:

//指定主键自动增长
        function insertAutoInc(indexDbName) {
            var userinfos=[{ 
                                id:1001, 
                                name:"小李", 
                                age:24 
                            },{ 
                                id:1002, 
                                name:"老王", 
                                age:30 
                            },{ 
                                id:1003, 
                                name:"王麻子", 
                                age:26 
                            }];            
                            var openRequest = indexedDB.open(indexDbName,2);
            openRequest.onerror = function(e) {//当创建数据库失败时候的回调
                console.log("Database error: " + e.target.errorCode);
            };
            openRequest.onsuccess = function(event) {
                console.log("Database created");
                db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
                //alert("this is :"+db);
                //打开和userinfo相关的objectstore的事物
                var transaction = db.transaction("userinfo",'readwrite'); 
                var store=transaction.objectStore("userinfo");                
                for(var i=0;i<userinfos.length;i++){                    
                //alert("add"+userinfos[i]);
                    store.add(userinfos[i]);//将对象添加至userinfo相关的objectstore中
                }
            };
            openRequest.onupgradeneeded = function(event) {
               var db = event.target.result;                
               //在第一次创建数据库的时候,就创建userinfo相关的objectstore,以供后面添加数据时候使用
                if(!db.objectStoreNames.contains('userinfo')){                    
                //keyPath:Javascript对象,对象必须有一属性作为键值
                    var objectStore = db.createObjectStore('userinfo',{autoIncrement: true});
                    objectStore.createIndex('nameIndex','name',{unique:true});//这里假定名字不能重复,创建基于name的唯一索引
                    objectStore.createIndex('ageIndex','age',{unique:false});//创建基于age的索引
                }
            }
        }

这里写图片描述
这里写图片描述

利用索引引用2数据

可以利用索引快速获取数据,name的索引是唯一的没问题,但是对于age索引只会取到第一个匹配值,要想得到所有age符合条件的值就需要引用3了

 function getDataByIndex(indexDbName) {
        var openRequest = indexedDB.open(indexDbName);        var db;
        openRequest.onerror = function(e) {//当创建数据库失败时候的回调
            console.log("Database error: " + e.target.errorCode);
        };
        openRequest.onsuccess = function(event) {
            console.log("Database created");
            db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
            var transaction = db.transaction("userinfo",'readwrite');            
            var objectStore = transaction.objectStore("userinfo");            
            var nameIndex = objectStore.index("nameIndex"); //获得nameIndex索引
            nameIndex.get("小李").onsuccess = function(e) { //根据name索引获得数据成功的回调
               var userinfo = e.target.result;
               console.log("id:"+userinfo.id+"==name:"+userinfo.name+"==age:"+userinfo.age);
            }
        }
    }

这里写图片描述

游标和索引结合使用

刚才我们不仅创建了一个name的唯一索引,而且还创建了一个age的索引,如果我们根据age来获取数据,有可能会有多条,由于age不唯一,所以这个时候就需要使用游标来遍历数据。这里我先插入两条age=24的记录。
这里写图片描述

function getDataByAgeIndex(indexDbName) {
        var openRequest = indexedDB.open(indexDbName);        var db;
        openRequest.onerror = function(e) {//当创建数据库失败时候的回调
            console.log("Database error: " + e.target.errorCode);
        };
        openRequest.onsuccess = function(event) {
            console.log("Database created");
            db = openRequest.result; //创建数据库成功时候,将结果给db,此时db就是当前数据库
            var transaction = db.transaction("userinfo",'readwrite');            
            var objectStore = transaction.objectStore("userinfo");            
            var nameIndex = objectStore.index("ageIndex"); //获得ageIndex索引
            var request = nameIndex.openCursor();//openCursor没有参数的时候,表示获得所有数据
            request.onsuccess = function(e) {//openCursor成功的时候回调该方法
              var cursor = e.target.result;              if (cursor) {//循环遍历cursor
                var userinfo = cursor.value;                //alert(userinfo.name);
                console.log("id:"+userinfo.id+"==name:"+userinfo.name+"==age:"+userinfo.age);
                cursor.continue();
              };
            }
        }
    }

这里写图片描述
同时可以在opencursor的时候传入key 引用4,来限制范围。
IDBKeyRange.only(value):只获取指定数据
IDBKeyRange.lowerBound(value,isOpen):获取最小是value的数据,第二个参数用来指示是否排除value值本身,也就是数学中的是否是开区间
IDBKeyRange.upperBound(value,isOpen):和上面类似,用于获取最大值是value的数据
IDBKeyRange.bound(value1,value2,isOpen1,isOpen2):表示在value1和value2之间,是否包含value1和value2

这里为了演示方便,我先删除之前的数据库,重新插入更多的数据,现在所有数据如下:
这里写图片描述
IDBKeyRange.only(value)
这里只需要在上面opencursor的时候将该限制条件传入即可,其他代码将保持不变,如下:

var request = nameIndex.openCursor(IDBKeyRange.only(Number(24)));

这里只根据age索引查询age==24的所有数据。
这里写图片描述
IDBKeyRange.lowerBound(value,isOpen)
在使用IDBKeyRange.lowerBound(28,true)来获取年龄大于28的并且包含28岁的所有数据。

var request = nameIndex.openCursor(IDBKeyRange.lowerBound(Number(28),true));

这里写图片描述

ok,今天就到这里了,希望大家喜欢。

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

100

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

34

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

13

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

19

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

27

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

11

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

371

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

28

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 7.1万人学习

HTML+CSS基础与实战
HTML+CSS基础与实战

共132课时 | 11.2万人学习

前端开发(基础+实战项目合集)
前端开发(基础+实战项目合集)

共60课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号