indexedDB示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>blue elephant</title>
    <style>
        .but{
            float: left;
            margin-right: 20px;
        }
        form{
            width: 300px;
        }
        .inp{
            width: 250px;
        }
    </style>
</head>
<body>
    <!-- 示例 -->
    <fieldset style="width: 300px;">
        <legend>基于indexedDB的雇员信息查询</legend>
            <p>输入信息</p>
            <p>雇员id</p>
            <input type="text" id="id" class="inp">
            <p>姓名</p>
            <input type="text" id="name" class="inp">
            <p>年龄</p>
            <input type="text" id="age" class="inp">
            <p>所属部门</p>
            <input type="text" id="sector" class="inp">
            <p>入职日期</p>
            <input type="text" id="date" class="inp">
            <p>职位</p>
            <input type="text" id="position" class="inp">
            <p>新资</p>
            <input type="text" id="salary" class="inp">

            <br>
            <br>
            <input type="button" name="insert" value="增" class="but" onclick="add()">
            <input type="button" name="del" value="删" class="but" onclick="del()">
            <input type="button" name="update" value="改" class="but" onclick="update()">
            <input type="button" name="select" value="查" class="but" onclick="get()">
            <input type="button" name="select" value="姓名查询" class="but" onclick="fromname()">
            <input type="button" name="select" value="部门查询" class="but" onclick="fromsector()">
            <input type="button" name="select" value="data" class="but" onclick="aa()">
            <br>
            <!-- 存放查询结果 -->
            <div id="test"></div>
    </fieldset>

<script>
    // 是存储在本地的NoSQL数据库,可以直接存储js对象,有版本的概念,要修改数据库结构只能通过升级数据库版本完成,存储空间一般不少于250MB,没有上限
    //支持索引,事务处理和健壮的查询功能,兼容所有主流浏览器,每个域名下都可以新建任意多个数据库
    // indexedDB数据库操作的步骤:1\打开数据库,获取数据库对象2\开启一个事务3\获取需要操作的对象仓库4\执行数据增删改查
    // 对indexedDB数据库的操作,通过window的indexedDB对象来执行
    // indexedDB数据操作都要在事务中完成,事务可以保证数据的一致性和完整性
    // 打开数据库,不存在则创建
    // let request = indexedDB.open(dbName,dbVersion);
    // dbName:字符串,表示数据库的名字
    // dbVersion:整数,表示数据库的版本
    // 异步API,返回一个IDBRequest对象,通过三种事件:error\success\upgradeneeded
    // 打开数据库,不存在则创建
    let request = indexedDB.open("blue",1);
    let db;
    // 创建成功的回调函数
    request.onsuccess = function(e){
        // 通过e拿到数据库对象
        db = e.target.result;
        console.log("数据库打开成功");
    }
    // 数据库升级事件(第一次创建数据库或者版本升级时触发)
    // 不能手动触发,需要触发时更改版本号或是新建数据库
    // 对数据库结构或表的创建修改都应该在该事件中完成,indexedDB不允许数据库中的对象仓库在同一版本中发生变化
    request.onupgradeneeded = function (e){
        console.log("新建数据库或数据库升级");
        // 将新的数据库对象赋值给db
        db = e.target.result;
        let sotre;
        // 判断是否已经存值该表(对象仓库)
        // 每个数据库包含若干个对象仓库(表),对象仓库里存储的是js对象
        if(!db.objectStoreNames.contains("employee")){
            // 设置主键
            // 主键用来建立默认的索引,必须是唯一的
            let item = {
                keyPath:"id",//主键
                autoIncrement:false//是否自增
            };
            // 创建对象仓库
            // 参数1指定对象仓库名称,参数2是个js对象,指定主键
            // 对象仓库保存的是数据记录,类似于关系型数据库的行,但是只有主键和数据两部分
            console.log("此处创建对象仓库");
            store = db.createObjectStore("employee",item);
            // 创建索引,为了加速数据的检索,为不同的属性建立索引,只有加了索引的属性才能进行查询
            // 必须在upgradeneeded里完成,在indexedDB数据库中,只能对被索引的属性值进行检索
            // 参数:索引名称\索引所在的属性\配置对象(说明改属性是否包含重复的值)
            store.createIndex("nameIndex","name",{unique:false});
            store.createIndex("sectorIndex","sector",{unique:true});
        }
    }
    // 创建失败的回调函数
    request.onerror = function(e){
        console.log("打开失败",e);
    }
    // 获取表单的值
    let id;
    let name;
    let age;
    let sector;
    let date;
    let position;
    let salary;
    function val(){
        id = document.getElementById("id").value;
        name = document.getElementById("name").value;
        age = document.getElementById("age").value;
        sector = document.getElementById("sector").value;
        date = document.getElementById("date").value;
        position = document.getElementById("position").value;
        salary = document.getElementById("salary").value;
        // 赋值给一个对象
        data = {
            id:id,
            name:name,
            age:age,
            sector:sector,
            date:date,
            position:position,
            salary:salary
        }
        return data;
    }
    // 新增
    function add(){
        // 获取表单的值
        val();
        // 开启一个事务
        let tx = db.transaction('employee',"readwrite");
        // 获取对象仓库
        let store = tx.objectStore("employee");
        // 执行数据操作(根据主键更新记录)
        let addReq = store.add(data);
        addReq.onsuccess = function(){
            alert("新增数据成功");
        }
        addReq.onerror = function(){
            alert("新增失败");
        }
    }
    // 更新
    function update(){
        val();
        // 开启一个事务
        let tx = db.transaction('employee',"readwrite");
        // 获取对象仓库
        let store = tx.objectStore("employee");
        // 执行数据操作(根据主键更新记录)
        //更新必须要有主键
        let putReq = store.put(data);
        putReq.onsuccess = function(){
            alert("修改数据成功");
        }
        putReq.onerror = function(){
            alter("修改失败");
        }
    }
// 删除
    function del(){
        val();
        // 开启一个事务
        let tx = db.transaction('employee',"readwrite");
        // 获取对象仓库
        let store = tx.objectStore("employee");
        // 执行数据操作(根据主键更新记录)
        let delReq = store.delete(id);
        delReq.onsuccess = function(){
            alert("删除数据成功");
        }
        delReq.onerror = function(){
            alter("删除失败");
        }
    }
    function get(){
        // 开启一个事务
        let tx = db.transaction('employee',"readwrite");
        // 获取对象仓库
        let store = tx.objectStore("employee");
        // 打开游标,可以获取一个区间的数据,通过对象仓库的openCursor方法创建并打开
        // 在success事件中遍历读取数据
        let cursorReq = store.openCursor();
            // 在success事件中遍历读取数据
            cursorReq.onsuccess = function(e){
                console.log("游标开始查询");
                // 获取游标
                let cursor = e.target.result;
                // 判断是否可以获取到游标
                let a = 0;
                if(cursor){
                    // 通过value属性获取对象记录
                    let obj = cursor.value;
                    console.log(obj.id);
                    console.log(obj.name);
                    let dom = document.createElement('p');
                    dom.id = "a"+a;
                    document.getElementById("test").appendChild(dom);
                    document.getElementById("a"+a).innerHTML = "雇员id:" + obj.id + "姓名:" + obj.name + "年龄" + obj.age + "部门" + obj.sector+ "职位"+obj.position +"新资"+obj.salary+"入职日期"+obj.date;
                    a++;
                    // 继续查询下一条数据
                    cursor.continue();
                }else{
                    console.log("游标数据结束");
                }
            }
    }
    // 根据名称索引查询
    function fromname(){
        val();
        // 开启一个事务
        let tx = db.transaction('employee',"readwrite");
        // 获取对象仓库
        let store = tx.objectStore("employee");
        // 获取索引项
        let nameIndex = store.index("nameIndex");
        //根据"name"从索引项中查询
        let request = nameIndex.get(name);
        request.onsuccess = function(e){
            let result = e.target.result;
            let dom = document.createElement('p');
            dom.id = "fromname";
            document.getElementById("test").appendChild(dom);
            document.getElementById("fromname").innerHTML = "雇员id:" + result.id + "姓名:" + result.name + "年龄" + result.age + "部门" + result.sector+ "职位"+result.position +"新资"+result.salary+"入职日期"+result.date;
        }
    }
    // 根据部门索引查询
    function fromsector(){
        val();
        // 开启一个事务
        let tx = db.transaction('employee',"readwrite");
        // 获取对象仓库
        let store = tx.objectStore("employee");
        let sectorIndex = store.index("sectorIndex");
        let request = nameIndex.get(sector);
        request.onsuccess = function(e){
            let result = e.target.result;
            let dom = document.createElement('p');
            dom.id = "fromsector";
            document.getElementById("test").appendChild(dom);
            document.getElementById("fromsector").innerHTML = "雇员id:" + result.id + "姓名:" + result.name + "年龄" + result.age + "部门" + result.sector+ "职位"+result.position +"新资"+result.salary+"入职日期"+result.date;
        }
    }
</script>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值