IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找接口,还能建立索引。这些都是 LocalStorage 所不具备的。就数据库类型而言,IndexedDB 不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。

IndexedDB 具有以下特点

(1)键值对储存。 IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。对象仓库中,数据以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。

(2)异步。 IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。

(3)支持事务。 IndexedDB 支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。

(4)同源限制 IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。

(5)储存空间大 IndexedDB 的储存空间比 LocalStorage 大得多,一般来说不少于 250MB,甚至没有上限。

(6)支持二进制储存。 IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。

IndexedDB操作步聚:
var db; //定义数据库实例
var indexedDBInstance = {

//开打数据库
OpenDB: function() {
//打开数据库[open(参数1,参数2) 参数1:表示数据库名称 参数2:表示数据库版本]
var resquest = window.indexedDB.open("h5", 1); //返回IDBRequest 对象,IDBRequest 对象 三个事件:error、success、upgradeneeded
resquest.onerror = function() {
//error失败事件
};
resquest.onupgradeneeded = function(event) {
//upgradeneeded事件[当指定数据库版本大于当前版本时 触发版本升级事件]
//新建数据库与打开数据库是同一个操作。如果指定的数据库不存在,就会新建。不同之处在于,后续的操作主要在upgradeneeded事件的监听函数里面完成,因为这时版本从无到有,所以会触发这个事件
db = event.target.result; //获取数据库实例对象
//创建表 必须在onupgradeneeded 回调中 调用
// var objectstore = indexedDBInstance.CreateTable("User", {
// keyPath: "id"
// }, 'test');
var objectstore = indexedDBInstance.CreateTable('User', {
autoIncrement: true
}, "test");
//创建索引
var index = indexedDBInstance.CreateIndex(objectstore);
};
resquest.onsuccess = function(event) {
//success成功事件
db = event.target.result; //获取数据库实例对象
console.log('数据库打开成功');
};
},
CreateTable: function(tableName, pk, transname) {
///<summary>
///创建表
///<param name="tableName">表名</param>
///<param name="pk">设置主键对象</param>
///<param name="transname">事物名称</param>
///</summary>
if (db) {
if (!db.objectStoreNames.contains(tableName, transname)) {
//pk:{ keyPath: 'id' } 表示主键为ID
//pk:{ autoIncrement: true } 表示主键自增长
//pk:{keyPath:'foo.bar'}主键也可以指定为下一层对象的属性,比如{ foo: { bar: 'baz' } }的foo.bar也可以指定为主键。
return db.createObjectStore(tableName, pk); //返回表对象
}
}
},
CreateIndex: function(objectstore) {
//createIndex()的三个参数分别为索引名称、索引所在的属性、配置对象(说明该属性是否包含重复的值)
objectstore.createIndex('name', 'Name', {
unique: false
});
objectstore.createIndex('qq', 'QQ', {
unique: true
});
},
AddData: function() {
///<summary>
///添加数据
///</summary>
var request = db.transaction(['User'], 'readwrite')
.objectStore('User')
.add({
id: 1,
Name: '张三',
QQ: '865110135'
});
request.onsuccess = function(event) {
console.log('数据写入成功');
};
request.onerror = function(event) {
console.log('数据写入失败');
}
},
EditData: function() {
///<summary>
///编辑数据
///</summary>
var request = db.transaction(['User'], 'readwrite')
.objectStore('User')
.put({
id: 1,
Name: 'tome',
QQ: '865110135'
});
request.onsuccess = function(event) {
console.log('数据更新成功');
};
request.onerror = function(event) {
console.log('数据更新失败');
}
},
ReadData: function() {
///<summary>
///获取单条数据
///</summary>
//get(参数1) ; 参数1:键值
var request = db.transaction(['User']).objectStore('User').get(1);
request.onerror = function(event) {
console.log('事务失败');
};
request.onsuccess = function(event) {
if (request.result) {
console.log('Name: ' + request.result.Name);
console.log('QQ: ' + request.result.QQ);
} else {
console.log('未获得数据记录');
}
};
},
ReadAllData: function() {
///<summary>
///获取所有数据
///</summary>
var objectStore = db.transaction(['User']).objectStore('User');
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
console.log('Id: ' + cursor.key);
console.log('Name: ' + cursor.value.Name);
console.log('QQ: ' + cursor.value.QQ);
cursor.continue();
} else {
console.log('没有更多数据了!');
}
};
},
DelData: function() {
///<summary>
///删除数据
///</summary>
var request = db.transaction(['User'], 'readwrite')
.objectStore('User')
.delete(1); //删除主键为1的数据
request.onsuccess = function(event) {
console.log('数据删除成功');
};
},
Clear: function() {
///<summary>
///清空数据
///</summary>
var transaction = db.transaction(['User'], 'readwrite');
var store = transaction.objectStore('User');
store.clear();
},
DelObjectStore: function() {
///<summary>
///删除表[执行此全动作必须发生在版本变更动作中]
///</summary>
db.deleteObjectStore('User');
},
DelDB: function() {
///<summary>
///删除库
///</summary>
window.indexedDB.deleteDatabase("h5");
}
}

前端缓存-IndexedDB的更多相关文章

  1. 使用gulp解决RequireJS项目前端缓存问题(二)

    1.前言 这一节,我们主要解决在上一节<使用gulp解决RequireJSs项目前端缓存问题(一)>末尾提到的几个问题: 对通过require-config.js引入的js文件修改后,没有 ...

  2. 使用gulp解决RequireJS项目前端缓存问题(一)

    1.前言 前端缓存一直是个令人头疼的问题,你有可能见过下面博客园首页的资源文件链接: 有没有发现文件名后面有一串不规则的东东,没错,这就是运用缓存机制,我们今天研究的就是这种东西. 先堵为快,猛戳链接 ...

  3. 使用JS实现前端缓存

    在前端浏览器中,有些数据(比如数据字典中的数据),可以在第一次请求的时候全部拿过来保存在js对象中,以后需要的时候就不用每次都去请求服务器了.对于那些大量使用数据字典来填充下拉框的页面,这种方法可以极 ...

  4. 使用Memcached、Spring AOP构建数据库前端缓存框架

    数据库访问可能是很多网站的瓶颈.动不动就连接池耗尽.内存溢出等.前面已经讲到如果我们的网站是一个分布式的大型站点,那么使用 memcached实现数据库的前端缓存是个很不错的选择:但如果网站本身足够小 ...

  5. 【js】了解前端缓存,收获不止于此!

    了解前端缓存,收获不止于此! 这次我们来讲一下关于前端缓存的问题.感谢赵欢同学提供doc素材. 首先,开局我画了一张图,你会对文章有一个大局了解. 今天讲的是前端缓存. 前端缓存有3大种:如图,分为H ...

  6. 配置 FIS 来适配 go revel 框架以优化前端缓存策略

    对于前端工程师来说,浏览器缓存优化是个永远的话题.前几天看了知乎上的一个问答:<大公司里怎样开发和部署前端代码?>,深以为然,所以决心使用 FIS 来优化自身的前端文件. 我们的项目使用了 ...

  7. 前端缓存API请求数据

    1. 背景 在一些项目中,有时候会出现不同模块重复请求大量相同api接口的情况,特别是在一些功能相似的后台管理页面中.以下面这几个页面为例,每次进入页面都需要请求等大量重复的下拉框数据,下拉框数据短时 ...

  8. ahjesus 前端缓存原理 转载

    LAMP缓存图 从图中我们可以看到网站缓存主要分为五部分 服务器缓存:主要是基于web反向代理的静态服务器nginx和squid,还有apache2的mod_proxy和mod_cache模 浏览器缓 ...

  9. Element-UI中Upload上传文件前端缓存处理

    Element-UI对于文件上传组件的功能点着重于文件传递到后台处理,所以要求action为必填属性.但是如果需要读取本地文件并在前端直接处理,文件就没有必要传递到后台,比如在本地打开一个JSON文件 ...

随机推荐

  1. Hadoop之中的一个:Hadoop的安装部署

    说到Hadoop不得不说云计算了,我这里大概说说云计算的概念,事实上百度百科里都有,我仅仅是copy过来,好让我的这篇hadoop博客内容不显得那么单调.骨感.云计算近期今年炒的特别火,我也是个刚開始 ...

  2. MFC程序打开文件对话框出错的问题解决

    前几天从网上下了个图像分析的mfc小程序,是VC6的 用VC6在本地编译生成都没问题.执行起来弹出一个未处理的错误,程序崩溃退出. 想起来原来遇到过打开文件对话框方面的问题,当时项目时间紧张未能深究. ...

  3. 【leetcode】Word Break(python)

    思路是这种.我们从第一个字符開始向后依次找,直到找到一个断句的地方,使得当前获得的子串在dict中,若找到最后都没找到.那么就是False了. 在找到第一个后,接下来找下一个断句处,当然是从第一个断句 ...

  4. ASP.NET for WebApi

    WebApi,听说过吧?呵呵. 感觉比WebService,WCF要强.尤其是那个啥WCF,啥鬼东西,真难懂.真难搞.真难用. 说比WebService要强,是因为不用在本地先生成个代理.而且XML也 ...

  5. CodeChef - CHEFPRAD Chef and Pairs 树形DP

     题意 给你一棵由 N 个节点构成的树 T.节点按照 1 到 N 编号,每个节点要么是白色,要么是黑色.有 Q 组询问,每组询问形如 (s, b).你需要检查是否存在一个连通子图,其大小恰好是 s,并 ...

  6. su: /bin/bash: Permission denied带来的疑惑

    >客户一个oracle突然当机了,由于业务启动,客户下意识的重启了服务器,系统是起来了,准备切换到oracle用户下启动数据库,可以怎么都无法su切换,真是火上浇油呀,描述如下: 在root用户 ...

  7. Swift学习笔记十四:构造(Initialization)

         类和结构体在实例创建时,必须为全部存储型属性设置合适的初始值. 存储型属性的值不能处于一个未知的状态.     你能够在构造器中为存储型属性赋初值,也能够在定义属性时为其设置默认值.下面章节 ...

  8. usdt源码编译安装

    1.依赖关系Boost >= 1.53 2.安装依赖包You will need appropriate libraries to run Omni Core on Unix, please s ...

  9. JAVA JVM 流程二

    作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚 ...

  10. 2015年沈阳网赛 Jesus Is Here(DP中的计数问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5459 题目描述:给定一个递推得来的字符串,问字符串中不同cff之间的距离之和, 递推规则: s1=c; ...