23. 离线应用与客户端存储(2)

本文深入介绍了IndexedDB,一种用于在浏览器中存储结构化数据的API,替代了已废弃的Web SQL Database。IndexedDB操作是异步的,包括数据库、对象存储空间、事务、游标查询和索引等概念。数据库使用对象存储数据,而非表,通过版本控制管理结构变化。对象存储空间中的数据可以通过键进行操作,游标则用于查询多个对象,而索引允许通过不同键访问数据。文章还讨论了并发问题和存储限制,确保在多标签页环境下正确处理 IndexedDB 操作。
摘要由CSDN通过智能技术生成
  • IndexedDB

Indexed Database API,或者简称为IndexedDB,是在浏览器中保存结构化数据的一种数据库。IndexedDB 是为了替代目前已被废弃的Web SQL Database API(因为已废弃,所以本书未介绍)而出现的。IndexedDB 的思想是创建一套API,方便保存和读取JavaScript 对象,同时还支持查询及搜索。

IndexedDB 设计的操作完全是异步进行的。因此,大多数操作会以请求方式进行,但这些操作会在后期执行,然后如果成功则返回结果,如果失败则返回错误。差不多每一次IndexedDB 操作,都需要你注册onerror 或onsuccess 事件处理程序,以确保适当地处理结果。

在得到完整支持的情况下,IndexedDB 将是一个作为API 宿主的全局对象。由于API 仍然可能有变化,浏览器也都使用提供商前缀,因此这个对象在IE10 中叫msIndexedDB,在Firefox 4 中叫mozIndexedDB,在Chrome 中叫webkitIndexedDB。为了清楚起见,本节示例中将使用IndexedDB,而实际上每个示例前面都应该加上下面这行代码:

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

1. 数据库:IndexedDB 就是一个数据库,与MySQL 或Web SQL Database 等这些你以前可能用过的数据库类似。IndexedDB 最大的特色是使用对象保存数据,而不是使用表来保存数据。一个IndexedDB 数据库,就是一组位于相同命名空间下的对象的集合。

var request, database;
request = indexedDB.open("admin");
request.onerror = function(event){
	alert("Something bad happened while trying to open: " +
	event.target.errorCode);
};
request.onsuccess = function(event){
	database = event.target.result;
};

在这两个事件处理程序中,event.target 都指向request 对象,因此它们可以互换使用。如果响应的是onsuccess 事件处理程序,那么event.target.result 中将有一个数据库实例对象(IDBDatabase),这个对象会保存在database 变量中。如果发生了错误,那event.target.errorCode 中将保存一个错误码,表示问题的性质。以下就是可能的错误码(这个错误码适合所有操作)。

  • IDBDatabaseException.UNKNOWN_ERR(1):意外错误,无法归类。
  • IDBDatabaseException.NON_TRANSIENT_ERR(2):操作不合法。
  • IDBDatabaseException.NOT_FOUND_ERR(3):未发现要操作的数据库。
  • IDBDatabaseException.CONSTRAINT_ERR(4):违反了数据库约束。
  • IDBDatabaseException.DATA_ERR(5):提供给事务的数据不能满足要求。
  • IDBDatabaseException.NOT_ALLOWED_ERR(6):操作不合法。
  • IDBDatabaseException.TRANSACTION_INACTIVE_ERR(7):试图重用已完成的事务。
  • IDBDatabaseException.ABORT_ERR(8):请求中断,未成功。
  • IDBDatabaseException.READ_ONLY_ERR(9):试图在只读模式下写入或修改数据。
  • IDBDatabaseException.TIMEOUT_ERR(10):在有效时间内未完成操作。
  • IDBDatabaseException.QUOTA_ERR(11):磁盘空间不足。

默认情况下,IndexedDB 数据库是没有版本号的,最好一开始就为数据库指定一个版本号。为此,可以调用setVersion()方法,传入以字符串形式表示的版本号。同样,调用这个方法也会返回一个请求对象,需要你再指定事件处理程序。

if (database.version != "1.0"){
	request = database.setVersion("1.0");
	request.onerror = function(event){
		alert("Something bad happened while trying to set version: " + event.target.errorCode);
	};
	request.onsuccess = function(event){
		alert("Database initialization complete. Database name: " + database.name + 
			", Version: " + database.version);
	};
} else {
	alert("Database already initialized. Database name: " + database.name + ",
        Version: " + database.version);
}

这个例子尝试把数据库的版本号设置为1.0。第一行先检测version 属性,看是否已经为数据库设置了相应的版本号。如果没有,就调用setVersion()创建修改版本的请求。如果请求成功,显示一条消息,表示版本修改成功。(在真实的项目开发中,你应该在这里建立对象存储空间。详细内容请看下一节。)

如果数据库的版本号已经被设置为1.0,则显示一条消息,说明数据库已经初始化过了。总之,通过这种模式,就能知道你想使用的数据库是否已经设置了适当的对象存储空间。在整个Web 应用中,随着对数据库结构的更新和修改,可能会产生很多个不同版本的数据库。

2. 对象存储空间:

在建立了与数据库的连接之后,下一步就是使用对象存储空间。如果数据库的版本与你传入的版本不匹配,那可能就需要创建一个新的对象存储空间。在创建对象存储空间之前,必须要想清楚你想要保存什么数据类型。

假设你要保存的用户记录由用户名、密码等组成,那么保存一条记录的对象应该类似如下所示:

var user = {
    username: "007",
    firstName: "James",
    lastName: "Bond",
    password: "foo"
};

有了这个对象,很容易想到username 属性可以作为这个对象存储空间的键。这个username 必须全局唯一,而且大多数时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值