html5本地存储之indexedDb

对于以下需求:

  • 离线存储读取数据
  • 允许用户对数据进行增删改操作
  • 数据存储在本地,不依赖后端
  • 数据支持索引查询

我们可以考虑使用html5新特性的本地存储,主要有以下几种:

  • Web Sql(IE,FF都不支持,http://www.w3.org/TR/webdatabase/)
  • IndexedDB
  • Local Storage(轻松存储简单的数据结构,如果存储复杂的较麻烦)
  • Session Storage(同Localstorage)
  • Cookies(有限制)
  • Application Cache(随后介绍)

我们可以考虑使用indexedDb来实现功能:

首先定义数据库对象

var testDB = {
    name   : "eason",
    version: 1,
    db     : null};

然后是数据库初始化:

function initDB(dbObj) {
    dbObj.version = dbObj.version || 1;    
    var request = indexedDB.open(dbObj.name, dbObj.version);
    request.onerror = function (e) {        
        console.log(e.currentTarget.error.message);
    };
    request.onsuccess = function (e) {
        dbObj.db = e.target.result;
    };
    request.onupgradeneeded = function (e) {        
    var thisDB = e.target.result;        
    if (!thisDB.objectStoreNames.contains("material")) {            
        var objStore = thisDB.createObjectStore("material", 
        {keyPath: "id", autoIncrement: true});
        objStore.createIndex("wxid", "wxid", {unique: true});
        }        
    if (!thisDB.objectStoreNames.contains("account")) {            
        var objStore = thisDB.createObjectStore("account", 
        {keyPath: "id", autoIncrement: true});
        objStore.createIndex("wxid", "wxid", {unique: true});
        objStore.createIndex("nickName", "nickName", {unique: false});
        }
    };

关闭数据库:

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

删除数据库:

function deleteDB(dbObj) {
    indexedDB.deleteDatabase(dbObj.name);
}

数据库表的CRUD操作:

Create:

function addData(dbObj, tableName, data, cb) {    
    var transaction = dbObj.db.transaction(tableName, ‘readwrite‘);
    transaction.oncomplete = function () {        
        console.log("transaction complete");
    };
    transaction.onerror = function (event) {        
        console.dir(event)
    };   
    var objectStore = transaction.objectStore(tableName);    
    var request = objectStore.add(data);
    request.onsuccess = function (e) { 
     if (cb) {
          cb({
                error: 0,
                data : data
          })
      }
    };
    request.onerror = function (e) {        
    if (cb) {
            cb({
                error: 1
            })
        }
    }
}

删除数据:

function deleteData(dbObj, tableName, id, cb) {    
    var transaction = dbObj.db.transaction(tableName, ‘readwrite‘);
    transaction.oncomplete = function () {        
        console.log("transaction complete");
    };
    transaction.onerror = function (event) {        
        console.dir(event)
    };    
    var objectStore = transaction.objectStore(tableName);    
    var request = objectStore.delete(parseInt(id));
    request.onsuccess = function (e) {        
    if (cb) {
            cb({
                error: 0,
                data : parseInt(id)
            })
        }
    };
    request.onerror = function (e) {        
    if (cb) {
            cb({
                error: 1
            })
        }
    }
}

查询数据:

(1)查询全部:

function getDataAll(dbObj, tableName, cb) {    
    var transaction = dbObj.db.transaction(tableName, ‘readonly‘);
    transaction.oncomplete = function () {        
        console.log("transaction complete");
    };
    transaction.onerror = function (event) {        
        console.dir(event)
    };    
    var objectStore = transaction.objectStore(tableName);    
    var rowData = [];
    objectStore.openCursor(IDBKeyRange.lowerBound(0)).onsuccess = function (event) {            var cursor = event.target.result;        
        if (!cursor && cb) {
            cb({
                error: 0,
                data : rowData
            });            return;
        }
        rowData.push(cursor.value);
        cursor.continue();
    };
}

(2)根据id查询数据

function getDataById(dbObj, tableName, id, cb) {    
    var transaction = dbObj.db.transaction(tableName, ‘readwrite‘);
    transaction.oncomplete = function () {        
        console.log("transaction complete");
    };
    transaction.onerror = function (event) {        
    console.dir(event)
    };    
    var objectStore = transaction.objectStore(tableName);    
    var request = objectStore.get(id);
    request.onsuccess = function (e) {        
    if (cb) {
            cb({
                error: 0,
                data : e.target.result
            })
        }
    };
    request.onerror = function (e) {        
    if (cb) {
            cb({
                error: 1
            })
        }
    }
}

(3)根据关键词索引数据:

function getDataBySearch(dbObj, tableName, keywords, cb) {    
    var transaction = dbObj.db.transaction(tableName, ‘readwrite‘);
    transaction.oncomplete = function () {        
        console.log("transaction complete");
    };
    transaction.onerror = function (event) {        
        console.dir(event)
    };    
    var objectStore = transaction.objectStore(tableName);    
    var boundKeyRange = IDBKeyRange.only(keywords);    var rowData;
    objectStore.index("nickName").openCursor(boundKeyRange).onsuccess = function (event)     {        var cursor = event.target.result;        
             if (!cursor) {            
             if (cb) {
                cb({
                    error: 0,
                    data : rowData
                })
            }            return;
        }
        rowData = cursor.value;
        cursor.continue();
    };
}

(4)根据页面索引数据:

function getDataByPager(dbObj, tableName, start, end, cb) {    
    var transaction = dbObj.db.transaction(tableName, ‘readwrite‘);
    transaction.oncomplete = function () {        
        console.log("transaction complete");
    };
    transaction.onerror = function (event) {        
        console.dir(event)
    };    
    var objectStore = transaction.objectStore(tableName);    
    var boundKeyRange = IDBKeyRange.bound(start, end, false, true);    
    var rowData = [];
    objectStore.openCursor(boundKeyRange).onsuccess = function (event) {        
    var cursor = event.target.result;        
    if (!cursor && cb) {
            cb({
                error: 0,
                data : rowData
            });            return;
        }
        rowData.push(cursor.value);
        cursor.continue();
    };
}

更新数据:

function updateData(dbObj, tableName, id, updateData, cb) {    
    var transaction = dbObj.db.transaction(tableName, ‘readwrite‘);
    transaction.oncomplete = function () {        
        console.log("transaction complete");
    };
    transaction.onerror = function (event) {        
        console.dir(event)
    };    
    var objectStore = transaction.objectStore(tableName);    
    var request = objectStore.get(id);
    request.onsuccess = function (e) {        
    var thisDB = e.target.result;        
    for (key in updateData) {
         thisDB[key] = updateData[key];
    }
     objectStore.put(thisDB);        
     if (cb) {
          cb({
                error: 0,
                data : thisDB
            })
        }
    };
    request.onerror = function (e) {        
    if (cb) {
            cb({
                error: 1
            })
        }
    }
}
时间: 2024-11-03 21:51:15

html5本地存储之indexedDb的相关文章

HTML5本地存储localStorage与sessionStorage

在最近的项目中用到了html5的本地存储,下面总结一下. 1.html5几种存储形式 本地存储(localStorage && sessionStorage) 离线缓存(application cache) indexedDB 和 webSQL 2.localStorage && sessionStorage 过期时间:localStorage 永久存储,永不失效除非手动删除 sessionStorage 浏览器重新打开后就消失了 大小:每个域名是5M. 注:cookie一

HTML5本地存储——Web SQL Database

在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就无能为力了,灵活大不够强大. Web SQL Database 我们经常在数据库中处理大量结构化数据,html5引入Web SQL Database概念,它使用 SQL 来操纵客户端数据库的 API,这些 API 是异步的,规范中使用的方言是SQLlite,悲剧正是产生于此,Web SQL Data

利用HTML5开发Android(7)---HTML5本地存储之Database Storage

在上一篇<HTML5本地存储之Web Storage篇>中,简单介绍了如何利用localStorage实现本地存储:实际上,除了sessionStorage和localStorage外,HTML5还支持通过本地数据库进行本地数据存储,HTML5采用的是"SQLite"这种文件型数据库,该数据库多集中在嵌入式设备上,熟悉IOS/Android开发的同学,应该对SQLite数据库比较熟悉. HTML5中的数据库操作比较简单,主要有如下两个函数: 1.通过openDatabase

利用HTML5开发Android(4)---HTML5本地存储之Web Storage

Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多,cookie大小被限制在4KB,Web Storage官方建议为每个网站5MB. Web Storage又分为两种: sessionStorage localStorage 从字面意思就可以很清楚的看出来,sessionStorage将数据保存在session中,浏览器关闭也就没了:而localStorage则一直将数据保存在客户端本地: 不管

HTML5本地存储LocalStorage和sessionStorage

以前用wordpress做博客的时候,我做了个点赞的功能.设计这个点赞功能的时候,为防止访客不断刷赞,得做个时间间隔限制,首先我的设计方案是在数据库里记录ip和点赞的时间,后来一想那还得维护数据库(其实是觉得都没人点赞还弄得那么严格搞什么),果断改成把数据放到本地保存. 本地存储数据首先想到得是cookie和html5的 localStorage. cookie兼容性好,但是存储的数据量太少;localStorage存储量大,但是兼容性不是很好,毕竟ie6之流还是有不少份额的.最后考虑到 htm

我的项目9 网页之间传值二 HTML5本地存储

在我的项目1中写到过网页之间传值,但是那种方式在andriod4.0和以下版本就传不过去了,于是乎,就打起了HTML5本地存储的注意.大家看一下代码就知道什么意思了: 发送数据页面: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript">

HTML5本地存储实例页面

HTML代码: <ul id="edit" contenteditable="true"> <li>修改我吧,然后刷新页面看看,^_^</li> </ul> JS代码: var edit = document.getElementById("edit"); edit.onblur = function(){ localStorage.setItem("tododata", thi

(转)HTML5 本地存储

原文:http://www.cnblogs.com/rainman/archive/2011/06/22/2086069.html HTML5 本地存储 1.sessionStorage 2.localStorage 3.Database Storage 4.globalStorage 5.兼容性 参考文献 本地持久化存储一直是本地客户端程序优于 web 程序的一个方面.对于本地应用程序,操作系统会一共一个抽象层,用于存储和获取特定于应用程序的数据,例如用户设置或者运行时状态.这些值可以被存储于

探索HTML5本地存储功能运用技巧(1)

通过实例,我们可以加深对HTML5本地存储的理解,并且可以熟练运用. 我们来实现一个简单应用,该应用中用户输入用户名和手机号,相关因袭可以保存到保存到本地,并可以进行查找.展示等基本操作. 以下只给我出关键代码,项目结构和基本代码以及CSS样式大家可以自己添加. 我们按照功能进行分布完成. 1.         存储功能 这里我们要完成,当用户输入姓名和手机号时,自己的信息存储到Web Storage中,html中代码如下: <form> <labelfor="username