- 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 必须全局唯一,而且大多数时候