创建了对象存储之后,剩下的所有操作都是通过事务完成的。事务要通过调用数据库对象的
transaction()方法创建。任何时候,只要想要读取或修改数据,都要通过事务把所有修改操作组织
起来。最简单的情况下,可以像下面这样创建事务:
let transaction = db.transaction();
如果不指定参数,则对数据库中所有的对象存储有只读权限。更具体的方式是指定一个或多个要访
问的对象存储的名称:
let transaction = db.transaction(“users”);
这样可以确保在事务期间只加载users 对象存储的信息。如果想要访问多个对象存储,可以给第
一个参数传入一个字符串数组:
let transaction = db.transaction([“users”, “anotherStore”]);
如前所述,每个事务都以只读方式访问数据。要修改访问模式,可以传入第二个参数。这个参数应
该是下列三个字符串之一:“readonly”、“readwrite"或"versionchange”。比如:
let transaction = db.transaction(“users”, “readwrite”);
这样事务就可以对users 对象存储读写了。
有了事务的引用,就可以使用objectStore()方法并传入对象存储的名称以访问特定的对象存储。
然后,可以使用add()和put()方法添加和更新对象,使用get()取得对象,使用delete()删除对象,
使用clear()删除所有对象。其中,get()和delete()方法都接收对象键作为参数,这5 个方法都创
建新的请求对象。来看下面的例子:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
request = store.get(“007”);
request.onerror = (event) => alert(“Did not get the object!”);
request.onsuccess = (event) => alert(event.target.result.firstName);
因为一个事务可以完成任意多个请求,所以事务对象本身也有事件处理程序:onerror 和oncomplete。
这两个事件可以用来获取事务级的状态信息:
transaction.onerror = (event) => {
// 整个事务被取消
};
transaction.oncomplete = (event) => {
// 整个事务成功完成
};
注意,不能通过oncomplete 事件处理程序的event 对象访问get()请求返回的任何数据。因此,
仍然需要通过这些请求的onsuccess 事件处理程序来获取数据。
插入对象
拿到了对象存储的引用后,就可以使用add()或put()写入数据了。这两个方法都接收一个参数,
即要存储的对象,并把对象保存到对象存储。这两个方法只在对象存储中已存在同名的键时有区别。这
种情况下,add()会导致错误,而put()会简单地重写该对象。更简单地说,可以把add()想象成插入
新值,而把put()想象为更新值。因此第一次初始化对象存储时,可以这样做:
// users 是一个用户数据的数组
for (let user of users) {
store.add(user);
}
每次调用add()或put()都会创建对象存储的新更新请求。如果想验证请求成功与否,可以把请求
对象保存到一个变量,然后为它添加onerror 和onsuccess 事件处理程序:
// users 是一个用户数据的数组
let request,
requests = [];
for (let user of users) {
request = store.add(user);
request.onerror = () => {
// 处理错误
};
request.onsuccess = () => {
// 处理成功
};
requests.push(request);
}
创建并填充了数据后,就可以查询对象存储了。
08-15
285
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-08
367
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-03
322
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-08
346
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-16
371
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-26
335
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
04-30
137
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-02
303
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)