浏览器的indexedDB的用法

 

IndexedDB和LocalStorage都是用来在浏览器里存储数据,但它们使用不同的技术,有不同的用途,你需要根据自己的情况适当的选择使用哪种。LocalStorage是用key-value键值模式存储数据,但跟IndexedDB不一样的是,它的数据并不是按对象形式存储它存储的数据都是字符串形式。如果你想让LocalStorage存储对象,你需要借助JSON.stringify()能将对象变成字符串形式,再用JSON.parse()将字符串还原成对象。但如果要存储大量的复杂的数据,这并不是一种很好的方案。毕竟,localstorage就是专门为小数量数据设计的,它的api是同步的

IndexedDB很适合存储大量数据,它的API是异步调用的。IndexedDB使用索引存储数据,各种数据库操作放在事务中执行。IndexedDB甚至还支持简单的数据类型。IndexedDB比localstorage强大得多,但它的API也相对复杂。

对于简单的数据,你应该继续使用localstorage,但当你希望存储大量数据时,IndexedDB会明显的更适合,IndexedDB能提供你更为复杂的查询数据的方式。


<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

    <title>Document</title>
    <style>

    </style>
</head>

<body>

<script>
	var Storage = function () {

		var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;

		if (indexedDB === undefined) {

			console.warn( 'Storage: IndexedDB not available.' );
			return {
				init: function () {
				}, get: function () {
				}, set: function () {
				}, clear: function () {
				}
			};

		}
		var name = 'wangliping03';
		var version = 1;
		var database;
		return {
			init: function ( callback ) {
				//open方法两个参数:第一个参数是数据库,第二个参数是数据库的版本
				var request = indexedDB.open( name, version );
				request.onupgradeneeded = function ( event ) {
					console.log("数据库第一次创建的时候,会被触发 ");
					var db = event.target.result;
					if (db.objectStoreNames.contains( 'person' ) === false) {
						//新增一张叫做states的表格,主键是id
                        //autoIncrement设置自增长
						db.createObjectStore( 'person' );
					}
				};
				//打开数据库成功
				request.onsuccess = function ( event ) {
					console.log("数据库打开成功");
					database = event.target.result;
					//打开成功之后会回调这个方法
					callback();
				};
				//打开数据库失败
				request.onerror = function ( event ) {
					console.log("数据库打开失败");
					console.error( 'IndexedDB', event );
				};
			},

			get: function ( callback ) {
				//插入数据,需要开启一个事务,并且要指定表格名称和操作模式(只读或读写)
				var transaction = database.transaction( [ 'person' ], 'readwrite' );
				var objectStore = transaction.objectStore( 'person' );
				var request = objectStore.get( 0 ); //可以看出异步回调
				request.onsuccess = function ( event ) {
					callback( event.target.result );
				};
			},

			set: function ( data, callback ) {
				var start = performance.now();
				var transaction = database.transaction( [ 'person' ], 'readwrite' );
				var objectStore = transaction.objectStore( 'person' );
				var request = objectStore.put( data, 0 );  //可以看出异步回调
				request.onsuccess = function ( event ) {
					callback();
					console.log( '[' + /\d\d\:\d\d\:\d\d/.exec( new Date() )[0] + ']', '保存用时:' + ( performance.now() - start ).toFixed( 2 ) + 'ms' );
				};
			},

			clear: function () {

				if (database === undefined) return;

				var transaction = database.transaction( [ 'person' ], 'readwrite' );
				var objectStore = transaction.objectStore( 'person' );
				var request = objectStore.clear();
				request.onsuccess = function ( event ) {

					console.log( '[' + /\d\d\:\d\d\:\d\d/.exec( new Date() )[0] + ']', 'Cleared IndexedDB.' );

				};

			}

		};

	};

	var sto = new Storage();
	sto.init( function () {
        //注意添加和获取信息代码写在init的回调里
		sto.set( {id:5,name:"xuhaitao-hunk"}, function () {
			console.log( "保存数据成功" );
		} );
		sto.get( function ( result ) {
			console.log( "获取数据结果:", result );
		} );

	} );

</script>
</body>

</html>

 




IndexedDB 具有以下特点。

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

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

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

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

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

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


FR:徐海涛(hunk Xu)
QQ技术交流群:386476712

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IndexedDB浏览器提供的本地数据库,可以在浏览器中存储结构化数据。下面是 IndexedDB 的基本使用方法: 1. 打开数据库 使用 `indexedDB` 对象的 `open()` 方法打开数据库,如下所示: ``` let request = indexedDB.open('myDB', 1); ``` 其中,第一个参数是数据库名称,第二个参数是数据库版本号。如果数据库不存在,则会创建一个新的数据库。 2. 创建对象仓库 在成功打开数据库的回调方法 `request.onsuccess` 中,可以获取到数据库对象 `event.target.result`,然后使用它的 `createObjectStore()` 方法创建一个对象仓库(即数据表),如下所示: ``` let db = event.target.result; let objectStore = db.createObjectStore('people', { keyPath: 'id' }); ``` 其中,第一个参数是对象仓库的名称,第二个参数是一个对象,包含一个 keyPath 属性和其他可选属性。keyPath 用来指定数据表中的主键。 3. 添加数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `add()` 方法向数据表中添加数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.add({ id: 1, name: 'John Doe' }); ``` 其中,第一个参数是一个数组,包含要访问的对象仓库的名称,第二个参数是事务类型,可以是 'readonly' 或 'readwrite'。`add()` 方法的参数是要添加的数据。 4. 查询数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `get()` 方法查询数据,如下所示: ``` let transaction = db.transaction(['people']); let objectStore = transaction.objectStore('people'); let request = objectStore.get(1); request.onsuccess = function(event) { console.log('Name: ' + event.target.result.name); }; ``` `get()` 方法的参数是要查询的数据的主键值。查询结果保存在 `request.onsuccess` 回调方法中的 `event.target.result` 中。 5. 更新数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `put()` 方法更新数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.put({ id: 1, name: 'Jane Doe' }); ``` `put()` 方法的参数是要更新的数据。 6. 删除数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `delete()` 方法删除数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.delete(1); ``` `delete()` 方法的参数是要删除的数据的主键值。 以上就是 IndexedDB 的基本使用方法。需要注意的是,IndexedDB 的 API 非常庞大,不仅仅包含上面提到的这些方法,还包括索引、游标、版本升级等功能。如果需要更详细的介绍和示例代码,可以参考 MDN 的文档:https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值