• HTML5本地存储——IndexedDB二:索引


    HTML5本地存储——IndexedDB(二:索引)

     

    HTML5本地存储——IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器——索引。

    熟悉数据库的同学都知道索引的一个好处就是可以迅速定位数据,提高搜索速度,在indexedDB中有两种索引,一种是自增长的int值,一种是keyPath:自己指定索引列,我们重点来看看keyPath方式的索引使用.

    创建索引

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

    • 索引名称
    • 索引属性字段名
    • 索引属性值是否唯一
    复制代码
    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')){
                        var store=db.createObjectStore('students',{keyPath: 'id'});
                        store.createIndex('nameIndex','name',{unique:true}); 
                        store.createIndex('ageIndex','age',{unique:false}); 
                    }
                    console.log('DB version changed to '+version);
                };
            }
    复制代码

    这样我们在students 上创建了两个索引

    image

    image

    利用索引获取数据

    复制代码
    function getDataByIndex(db,storeName){
                var transaction=db.transaction(storeName);
                var store=transaction.objectStore(storeName);
                var index = store.index("nameIndex");
                index.get('Byron').onsuccess=function(e){
                    var student=e.target.result;
                    console.log(student.id);
                }
            }
    复制代码

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

    游标

    在indexedDB中使用索引和游标是分不开的,对数据库熟悉的同学很好理解游标是什么东东,有了数据库object store的游标,我们就可以利用游标遍历object store了。

    使用object store的openCursor()方法打开游标

    复制代码
    function fetchStoreByCursor(db,storeName){
                var transaction=db.transaction(storeName);
                var store=transaction.objectStore(storeName);
                var request=store.openCursor();
                request.onsuccess=function(e){
                    var cursor=e.target.result;
                    if(cursor){
                        console.log(cursor.key);
                        var currentStudent=cursor.value;
                        console.log(currentStudent.name);
                        cursor.continue();
                    }
                };
            }
    复制代码

    curson.contine()会使游标下移,知道没有数据返回undefined

    index与游标结合

    要想获取age为26的student,可以结合游标使用索引

    复制代码
    function getMultipleData(db,storeName){
                var transaction=db.transaction(storeName);
                var store=transaction.objectStore(storeName);
                var index = store.index("ageIndex");
                var request=index.openCursor(IDBKeyRange.only(26))
                request.onsuccess=function(e){
                    var cursor=e.target.result;
                    if(cursor){
                        var student=cursor.value;
                        console.log(student.id);
                        cursor.continue();
                    }
                }
            }
    复制代码

    这样我们可是使用索引打开一个游标,参数下面会讲到,在成功的句柄内获得游标便利age为26的student,也可以通过index.openKeyCursor()方法只获取每个对象的key值。

    指定游标范围

    index.openCursor()/index.openKeyCursor()方法在不传递参数的时候会获取object store所有记录,像上面例子一样我们可以对搜索进行筛选
    可以使用key range 限制游标中值的范围,把它作为第一个参数传给 openCursor() 或是 openKeyCursor()
    IDBKeyRange.only(value):只获取指定数据
    IDBKeyRange.lowerBound(value,isOpen):获取最小是value的数据,第二个参数用来指示是否排除value值本身,也就是数学中的是否是开区间
    IDBKeyRange.upperBound(value,isOpen):和上面类似,用于获取最大值是value的数据
    IDBKeyRange.bound(value1,value2,isOpen1,isOpen2):不用解释了吧

    获取名字首字母在B-E的student

    复制代码
    function getMultipleData(db,storeName){
                var transaction=db.transaction(storeName);
                var store=transaction.objectStore(storeName);
                var index = store.index("nameIndex");
                var request=index.openCursor(IDBKeyRange.bound('B','F',false,
    true
    ));
                request.onsuccess=function(e){
                    var cursor=e.target.result;
                    if(cursor){
                        var student=cursor.value;
                        console.log(student.name);
                        cursor.continue();
                    }
                }
            }
    复制代码

     完整示例

    复制代码
      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4     <title>IndexedDB</title>
      5 </head>
      6 <body>
      7     <script type="text/javascript">
      8         function openDB (name,version) {
      9             var version=version || 1;
     10             var request=window.indexedDB.open(name,version);
     11             request.onerror=function(e){
     12                 console.log(e.currentTarget.error.message);
     13             };
     14             request.onsuccess=function(e){
     15                 myDB.db=e.target.result;
     16             };
     17             request.onupgradeneeded=function(e){
     18                 var db=e.target.result;
     19                 if(!db.objectStoreNames.contains('students')){
     20                     var store=db.createObjectStore('students',{keyPath: 'id'});
     21                     store.createIndex('nameIndex','name',{unique:true}); 
     22                     store.createIndex('ageIndex','age',{unique:false}); 
     23                 }
     24                 console.log('DB version changed to '+version);
     25             };
     26         }
     27 
     28         function closeDB(db){
     29             db.close();
     30         }
     31 
     32         function deleteDB(name){
     33             indexedDB.deleteDatabase(name);
     34         }
     35 
     36         function addData(db,storeName){
     37             var transaction=db.transaction(storeName,'readwrite'); 
     38             var store=transaction.objectStore(storeName); 
     39 
     40             for(var i=0;i<students.length;i++){
     41                 store.add(students[i]);
     42             }
     43         }
     44 
     45         function getDataByKey(db,storeName,value){
     46             var transaction=db.transaction(storeName,'readwrite'); 
     47             var store=transaction.objectStore(storeName); 
     48             var request=store.get(value); 
     49             request.onsuccess=function(e){ 
     50                 var student=e.target.result; 
     51                 console.log(student.name); 
     52             };
     53         }
     54 
     55         function updateDataByKey(db,storeName,value){
     56             var transaction=db.transaction(storeName,'readwrite'); 
     57             var store=transaction.objectStore(storeName); 
     58             var request=store.get(value); 
     59             request.onsuccess=function(e){ 
     60                 var student=e.target.result; 
     61                 student.age=35;
     62                 store.put(student); 
     63             };
     64         }
     65 
     66         function deleteDataByKey(db,storeName,value){
     67             var transaction=db.transaction(storeName,'readwrite'); 
     68             var store=transaction.objectStore(storeName); 
     69             store.delete(value); 
     70         }
     71 
     72         function clearObjectStore(db,storeName){
     73             var transaction=db.transaction(storeName,'readwrite'); 
     74             var store=transaction.objectStore(storeName); 
     75             store.clear();
     76         }
     77 
     78         function deleteObjectStore(db,storeName){
     79             var transaction=db.transaction(storeName,'versionchange'); 
     80             db.deleteObjectStore(storeName);
     81         }
     82 
     83         function fetchStoreByCursor(db,storeName){
     84             var transaction=db.transaction(storeName);
     85             var store=transaction.objectStore(storeName);
     86             var request=store.openCursor();
     87             request.onsuccess=function(e){
     88                 var cursor=e.target.result;
     89                 if(cursor){
     90                     console.log(cursor.key);
     91                     var currentStudent=cursor.value;
     92                     console.log(currentStudent.name);
     93                     cursor.continue();
     94                 }
     95             };
     96         }
     97 
     98         function getDataByIndex(db,storeName){
     99             var transaction=db.transaction(storeName);
    100             var store=transaction.objectStore(storeName);
    101             var index = store.index("ageIndex");
    102             index.get(26).onsuccess=function(e){
    103                 var student=e.target.result;
    104                 console.log(student.id);
    105             }
    106         }
    107 
    108         function getMultipleData(db,storeName){
    109             var transaction=db.transaction(storeName);
    110             var store=transaction.objectStore(storeName);
    111             var index = store.index("nameIndex");
    112             var request=index.openCursor(null,IDBCursor.prev);
    113             request.onsuccess=function(e){
    114                 var cursor=e.target.result;
    115                 if(cursor){
    116                     var student=cursor.value;
    117                     console.log(student.name);
    118                     cursor.continue();
    119                 }
    120             }
    121         }
    122 
    123         var myDB={
    124             name:'test',
    125             version:1,
    126             db:null
    127         };
    128 
    129         var students=[{ 
    130             id:1001, 
    131             name:"Byron", 
    132             age:24 
    133         },{ 
    134             id:1002, 
    135             name:"Frank", 
    136             age:30 
    137         },{ 
    138             id:1003, 
    139             name:"Aaron", 
    140             age:26 
    141         },{ 
    142             id:1004, 
    143             name:"Casper", 
    144             age:26 
    145         }]; 
    146     </script>
    147 </body>
    148 </html>
    复制代码

     

    最后

    有了游标和索引才能真正发挥indexedDB为例,是不是感觉比自定义对象强大方便了很多呢。

     来源于:http://www.cnblogs.com/dolphinX/p/3416889.html

  • 相关阅读:
    10大开源文档管理系统,知识管理系统
    okhttp原理,okhttp为什么好?
    开放式创新对程序开发有什么深远的影响?
    TypeScript中文手册【从入门到精通】
    CentoOS6 32停更了,如何继续用yum源【解决方案】
    electronic为什么要用JavaScript开发桌面应用
    统一身份认证登录入口,统一用户认证和单点登录解决方案
    PHP数组如何倒叙 array_reverse
    Windows electron开发实例大全
    AI深度学习的基础上处理自然语言
  • 原文地址:https://www.cnblogs.com/benbentu/p/4930106.html
Copyright © 2020-2023  润新知