• IndexedDB


    var myDB = (function(){
        return {
            dbName: 'usersDB',     // 数据库名
            daVer: 1,              // 数据库版本号
            db: '',                // 用于数据库对象
            dbData: [],            // 用于临时存放数据的数组
    
    // 连接数据库
        openDB: function(){
            var request = indexedDB.open(this.dbName, this.daVer);
            request.onsuccess = function(e){
                db = e.target.result;
                console.log('连接数据库成功');
                // 数据库连接成功后渲染表格
                vm.getData();
            }
            request.onerror = function(){
                console.log('连接数据库失败');
            }
            // onupgradeneeded事件在第一次打开页面初始化数据库时会被调用,或在当有版本号变化时
            request.onupgradeneeded = function(e){
                db = e.target.result;
                // 如果不存在Users对象仓库则创建
                if(!db.objectStoreNames.contains('Users')){
                    var store = db.createObjectStore('Users',{keyPath: 'id', autoIncrement: true});
                    var idx = store.createIndex('index','username',{unique: false})
                }
            }
        },
    
        /**
         * 保存数据
         * @param {Object} data 要保存到数据库的数据对象
         */
        saveData: function(data){
            var tx = db.transaction('Users','readwrite');
            var store = tx.objectStore('Users');
            var req = store.put(data);
            req.onsuccess = function(){
                console.log('成功保存id为'+this.result+'的数据');
            }
        },
    
        /**
         * 更新数据
         * @param {function} callback 回调函数
         */
        updataData: function(key,newData){
            var tx = db.transaction('Users','readwrite');
            var store = tx.objectStore('Users');
            var req = store.get(key);
            req.onsuccess = function(e) {
                var data = e.target.result;
                for (a in newData) {
                    data[a] = newData[a]
                }
                store.put(data);
            };
        },
    
        /**
         * 删除单条数据
         * @param {int} id 要删除的数据主键
         */
        deleteOneData: function(id){
            var tx = db.transaction('Users','readwrite');
            var store = tx.objectStore('Users');
            var req = store.delete(id);
            req.onsuccess = function(){
                // 删除数据成功之后重新渲染表格
                vm.getData();
            }
        },
        /**
         * 根据key查询数据
         * @param {int} key 要搜索的数据主键
         */
        keyServerData: function(key){
            var tx = db.transaction('Users','readwrite');
            var store = tx.objectStore('Users');
            var req = store.get(key);
            req.onsuccess = function(e){
                data = e.target.result;
                console.log(data)
            }
        },
        /**
         * 根据索引查询数据
         * @param {int} key 要搜索的数据主键
         */
        indexServerData: function(index,name){
            var tx = db.transaction('Users','readwrite');
            var store = tx.objectStore('Users');
            var req = store.index(index).get(name);
            req.onsuccess = function(e){
                data = e.target.result;
                console.log(data)
            }
        },
        /**
         * 检索全部数据
         * @param {function} callback 回调函数
         */
        searchData: function(callback){
            var tx = db.transaction('Users','readonly');
            var store = tx.objectStore('Users');
            var range = IDBKeyRange.lowerBound(1);
            var req = store.openCursor(range,'next');
            // 每次检索重新清空存放数据数组
            dbData = [];
            req.onsuccess = function(){
                var cursor = this.result;
                if(cursor){
                    // 把检索到的值push到数组中
                    dbData.push(cursor.value);
                    cursor.continue();
                }else{
                    // 数据检索完成后执行回调函数
                    callback && callback();
                }
            }
        },
        /**
         * 关闭数据库
         * @param {String} name 数据库名
         */
        closeDB: function(name) {
            db.close();
        },
        /**
         * 删除数据库
         * @param {String} str 数据库名
         */
        deleteDB: function(name) {
            indexedDB.deleteDatabase(name);
        }
    }
    })()
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <link rel="stylesheet" href="./style.css">
        <script src="node_modules/babel-polyfill/dist/polyfill.min.js"></script>
        <script src="node_modules/_indexeddbshim@3.7.0@indexeddbshim/dist/indexeddbshim.min.js"></script>
    </head>
    <body>
    <div id="app">
        <div class="main">
            <div class="v-form">
                <input type="text" class="v-input" placeholder="请输入姓名" name="username" v-model="username">
                <input type="text" class="v-input" placeholder="请输入年龄" name="age" v-model="age">
                <input type="text" class="v-input" placeholder="请输入邮箱" name="email" v-model="email">
                <button type="text" class="v-btn" @click="submit">提交</button>
            </div>
            <table class="table">
                <thead>
                <th>#</th>
                <th>用户名</th>
                <th>年龄</th>
                <th>邮箱</th>
                <th>操作</th>
                </thead>
                <tr v-for="(item,i) in dbData" :key="item.id">
                    <td v-html="i+1"></td>
                    <td v-html="item.username"></td>
                    <td v-html="item.age"></td>
                    <td v-html="item.email"></td>
                    <td>
                        <button class="edit" @click="edit(i)">编辑</button>
                        <button class="del" @click="myDB.deleteOneData(item.id)">删除</button>
                    </td>
                </tr>
            </table>
            <button @click="fn">更新</button>
            <button @click="searchKey">查询index</button>
            <button @click="searchId">查询key</button>
        </div>
    </div>
    <script src="https://cdn.bootcss.com/vue/2.2.6/vue.min.js"></script>
    <script src="index.js"></script>
    
    <script>
    
        function fn() {
            myDB.updataData(4,{username: '王老吉'})
        }
        function searchKey() {
            myDB.indexServerData('index','SharkChilli')
        }
        function searchId() {
            myDB.keyServerData(4)
        }
        var vm = new Vue({
            el: '#app',
            data: {
                edit_id: 0,
                username: '',
                age: '',
                email: '',
                dbData: []
            },
            mounted: function(){
                myDB.openDB();
            },
            methods: {
                submit: function(){
                    if(this.username && this.age && this.email){
                        var param = {
                            username: this.username,
                            age: this.age,
                            email: this.email
                        }
                        if(this.edit_id > 0){
                            param.id = this.edit_id
                        }
                        myDB.saveData(param);
                        this.getData();
                        this.username = this.age = this.email = '';
                    }
                },
                getData: function(){
                    var self = this;
                    myDB.searchData(function(){
                        self.dbData = myDB.dbData;
                    });
                },
                edit: function(index){
                    this.username = myDB.dbData[index].username;
                    this.age = myDB.dbData[index].age;
                    this.email = myDB.dbData[index].email;
                    this.edit_id = myDB.dbData[index].id;
                }
            }
        })
    </script>
    </body>
    </html>

  • 相关阅读:
    Parcel与Parcelable剖析
    Binder文集
    Charles 使用教程
    AsyncTask
    Android 编译时注解
    scanf(),gets(),getchar()
    银行家算法
    最长公共子序列(LCS)问题
    动态规划 求解数字三角形最大值
    参数 存在二维数组
  • 原文地址:https://www.cnblogs.com/SharkChilli/p/9183992.html
Copyright © 2020-2023  润新知