使用indexedDB(二)(翻译)
插入、查询、删除数据 在您对新建的数据库做任何操作之前,需要开启一个事务。事务源自数据库对象,您必须指定事务要涵盖的对象store。一旦进入事务,您就能够访问对象store,用以操作数据和创建请求。接下来,您需要决定是更改数据库还是读取数据库的内容。事务有三个有效模式:只读,读写,版本变更。 变更数据库模式或者结构——牵涉到创建或者删除对象store或者index——必须让事务处于版本变更versionchange模式。通过呼叫IDBFactory.open并指定版本号来打开该事务。(Webkit浏览器,没有完善最新的IndexedDB版本,IDBFactory.open只能携带一个参数:数据库名字;那么您必须呼叫IDBVersionChangeRequest.setVersion来建立versionchange事务)。 为了读取对象store中的记录,事务可以使用readonly模式或者readwrite模式。如果要更改记录,事务必须处于readwrite模式。您通过呼叫IDBDatabase.transaction()函数来打 事务,该函数接受两个参数, storeNames(作用域,定义为您将要访问的对象store类型数组),模式mode(readonly或者 readwrite)。该函数返回事务对象,该对象包含DBIndex.objectStore方法,您可以用它访问对象store。默认地,事务以readonly模式打开。 注意:从firefox40开始,IndexedDB事务为了提高性能已经放宽了durability。以前,在读写事务中,只有当所有数据 都已写入磁盘时,才会触发IDBTransaction.oncomplete。在firefox40及更高的版本中,操作系统被告知开始写数据之后,但是隐含地,在数据完全写入磁盘之前,oncomplete事件就会被触发。
为事务正确设置作用域和模式,可以提高数据访问性能,要点如下: 定义作用域时,只指定您需要的对象store,这样,您就可以同时无重叠(scope)地运行多个事务 只在必要时指定读写readwrite模式。您可以同时重叠(scope)地运行多个readonly事务,但是只能为一个对象store运行readwrite事务。 插入数据 如果您新建的数据库,您可能想写入数据。如下所示: // Note: Older experimental implementations use the deprecated constant IDBTransaction.READ_WRITE instead of "readwrite".// In case you want to support such an implementation,you can write:// var transaction = db.transaction(["customers"],IDBTransaction.READ_WRITE);vartransaction=db.transaction(["customers"],"readwrite"); transaction()函数有两个参数,并返回一个transaction对象。第一个参数是事务涵盖的对象store列表,(即事务的scope)。 如果您想让事务涵盖所有的对象store,您可以在此处指定一个空数组,但是请不要那样做,因为规范说了,空数组将引发 InvalidAccessError错误。如果您不指定第二个参数,默认地将使用read-only模式。如您想写数据库,请指定为readwrite。 现在您创建了事务,您需要了解它的生存期。事务与事件循环绑定的非常紧密。如果您创建了事务并返回给事件循环, 然而并没有使用,那么事务将变成非活动状态。让事务保持活动状态的唯一方法是在其上创建一个请求。当请求完成时, 您将得到一个DOM事件,将定请求是成功的,您将有新的机会在回调函数中扩展事务。如果您没有扩展事务就返回给了事务循环,事务将变成非活动状态,以此类推。只要存在等待期pending的请求,事务将保持活动状态。事务的生存期确实很简单,但是要掌握它还是需要一些时间的。更多一些例子,也会有助于理解。如果您已经开始阅读 TRANSACTION_INACTIVE_ERR错误码,就不合适了(因为还没理解事务的生存期)。
事务可以分为三种类型的DOM事件:error,abort,和complete。我们已经讨论了error事件的冒泡方式,因此,事务接受任何从它产生的请求抛出的error事件。更微妙的是, error事件的默认行为是中止它所在的事务。除非您在错误处理中先调用stopPropagation()再执行其它处理,否则事务将回滚。这样的设计可以强制要求考虑和处理错误,但是 如果错误处理太冗长、琐碎,您可以在数据库对象上绑定一个错误处理。如果您没有处理错误事件,或者在事务上呼叫了Abort()函数,事务将回滚,事务的回滚事件将被触发。 或者,所有的等待期pending的请求都被处理完。您将得到一个Complete事件。如果您执行大量的数据库操作,那么跟踪事务而不是单个的请求,将有助于您理清思路。 现在您有事务了,您需要从中获取对象store。事务只是让您拥有当初创建事务时指定的那个对象store。然后您可以向对象store中添加数据了。 // Do something when all the data is added to the database. transaction.oncomplete = function(event) { alert("All done!"); }; transaction.onerror { // Don't forget to handle errors! ; var objectStore = transaction.objectStore"customers"; for (var i in customerData{ var request = objectStoreadd(customerData[i]; request.onsuccess { // event.target.result == customerData[i].ssn; } 呼叫add()方法产生的请求结果是被添加的【键】的值。在此情况下,它应该等于被添加对象的ssn属性,因为对象store 删除数据 删除数据很简单: = dbtransaction([, "readwrite") .delete"444-44-4444"; request// It's gone! ;查询数据 既然数据库中已经有数据了,您可以通过几种方法查询数据。首先,最简单的get()方法。您需要提供【key】来查询数 var transaction get// Handle errors! // Do something with the request.result! "Name for SSN 444-44-4444 is " + request.result.name; 对于一个“简单”查询来说,代码还是有点多啊。这里您可以让它更缩短一些,假定您在数据库层面处理了错误消息: db+ event.target; 看看它是如何工作的?因为只有一个对象store,您不用传递对象store列表,而只把对象store的名字给事务。而且,
更新数据
;
;
request// Get the old value that we want to update
var data = event; // update the value(s) in the object that you want to change data.age = 42; // Put this updated object back into the database. var requestUpdate put(data; requestUpdate{ // Do something with the error // Success - the data is updated! ; 在这里我们创建一个objectStore,请求读出一个数据记录,使用【键】值ssn:444-44-4444。然后把查询结果存放在
注意:此时,我们必须指定readwrite模式的事务,因为要写入数据库内容,而不只是查询数据 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |