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. wsdl2objc定制(一)namespace

    1.问题抛出: 如今还是有非常多人使用 wsdl2objc 来调用webservice,可是有时候会有不开心的事情发生, <soap:Envelope xmlns:soap="http ...

  2. VMware一些使用心得

    这段时间VMware workstation用得较多,装了好几个虚拟机,有win2003,win2008,win7,还分32位,64位.装了这么多,要么是用于安装一些软件,比如oracle12c,因为 ...

  3. Linux服务基础命令

    ---恢复内容开始--- 1简介: Linux的网络功能相当强悍,一时之间我们无法了解所有的文阿罗命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig     查询,设置网卡和i ...

  4. (19)javaWeb项目名称修改

    1,选中项目,[右键]-[Refactor]-[Rename] 在弹出面板中,填写New Name 点击[OK] 2,改变运行时目录名称 选中项目[右键]-[Properties] 在弹框中选择选择[ ...

  5. 用 kGDB 调试 Linux 内核

    简介 这个文档记录了用kGDB调试Linux内核的全过程,都是在前人工作基础上的一些总结.以下操作都是基于特定板子来进行,但是大部分都能应用于其他平台. 要使用KGDB来调试内核,首先需要修改conf ...

  6. HDU3488 Tour —— 二分图最大权匹配 KM算法

    题目链接:https://vjudge.net/problem/HDU-3488 Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit ...

  7. RabbitMQ的远程Web管理与监控工具

    RabbitMQ提供了完善的管理和监控工具,分management plugin 和 rabbitmqctl 两种类型的工具. 1.management plugin  rabbitmq-manage ...

  8. less 语法

    1 变量 less的变量使用@开头 1.1 demo @colorRed:red; @colorBlue:blue; .demo{ color:@colorRed; background-color: ...

  9. Bootstrap 垂直(默认)表单

    在建立asp.net mvc视图中,默认的表单是垂直表单,与vs 自动创建的T4模板是水平表单,相比较,没有了<div class="form-horizontal"> ...

  10. 【黑金教程笔记之001】veriloghdl 扫盲文—笔记&勘误

    001_veriloghdl 扫盲文—笔记&勘误 2014/10/31 原文作者:akuei2 联系方式:blog.ednchina.con/akuei2 勘误001: Page 3 0.1 ...