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. BC1.2的一些心得

    什么叫DCD DataContact Detect(DCD) 1.首先是DCD 2.然后是Primary detection 3.然后是Secondary detection 检測充电的条件是VBUS ...

  2. Hackrank Candies DP

    题目链接:传送门 题意: n个学生站一行,老师给每个学生发至少一个糖 相邻学生,a[i] > a[i-1] 的话,那么右边学生的糖一定要发得比左边学生的糖多 问你满足条件这个老师总共最少的发多少 ...

  3. Perl Compatible Regular Expressions

    http://www.pcre.org/ http://www.pcre.org/

  4. CentOS 7.2更改网卡名称

    背景 没啥背景,就是VMWare装的CentOS虚拟机的自带网卡名有点乱,想重新定义一下. 环境 1.VMWare虚拟机 6张网卡 2.系统 [root@localhost ~]# cat /etc/ ...

  5. 如何获取板子上独有的ID号EXYNOS4412/Imx6ul【转】

    本文转载自:http://blog.csdn.net/u010871058/article/details/75637175 每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含 ...

  6. nginx性能优化技巧

    前几天买了本高俊峰的<高性能Linux服务器构建实战I>,网上都说运维必备手册,昨天看了目录加小50页感觉还是比较扩充视野的,很多东西在学校是不可能学到的,就是感觉有的地方讲的仍然不是很清 ...

  7. Iphone 启动图的尺寸

    APP图标设置 - 取Images.xcassets中的AppIcon, 图标尺寸 29pt * 2x => 58 * 5829pt * 3x => 87 * 8740pt * 2x =& ...

  8. 最好的6个Go语言Web框架

    原文:Top 6 web frameworks for Go as of 2017 作者:Edward Marinescu 译者:roy 译者注:本文介绍截至目前(2017年)最好的6个Go语言Web ...

  9. C#即时通讯系统设计与实现(一)

    最近学习了一下即时通讯,写了几天了,现在把遇到的问题和得到的心得在这里分享下. 即时通讯,C/S模式,在服务器上架设服务端,服务端是服务形式的,可以设置为开机自启动,客户端进行访问,可以安装在任意一台 ...

  10. CentOS7.5 -- Ansible部署与应用

    第1章 Ansible概述 Ansible是一个配置管理系统configuration management system python 语言是运维人员必须会的语言 ansible 是一个基于pyth ...