## 第五节:IDBDatabase 对象
打开数据成功以后,可以从`IDBOpenDBRequest`对象的`result`属性上面,拿到一个`IDBDatabase`对象,它表示连接的数据库。后面对数据库的操作,都通过这个对象完成。
~~~
var db;
var openRequest = window.indexedDB.open('demo', 1);
openRequest.onerror = function (event) {
console.log('Error');
};
openRequest.onsuccess = function(event) {
db = openRequest.result;
// ...
};
~~~
## 一、属性
`IDBDatabase`对象有以下属性。
* `IDBDatabase.name`:字符串,数据库名称。
* `IDBDatabase.version`:整数,数据库版本。数据库第一次创建时,该属性为空字符串。
* `IDBDatabase.objectStoreNames`:DOMStringList 对象(字符串的集合),包含当前数据的所有 object store 的名字。
* `IDBDatabase.onabort`:指定 abort 事件(事务中止)的监听函数。
* `IDBDatabase.onclose`:指定 close 事件(数据库意外关闭)的监听函数。
* `IDBDatabase.onerror`:指定 error 事件(访问数据库失败)的监听函数。
* `IDBDatabase.onversionchange`:数据库版本变化时触发(发生`upgradeneeded`事件,或调用`indexedDB.deleteDatabase()`)。
下面是`objectStoreNames`属性的例子。该属性返回一个 DOMStringList 对象,包含了当前数据库所有对象仓库的名称(即表名),可以使用 DOMStringList 对象的`contains`方法,检查数据库是否包含某个对象仓库。
~~~
if (!db.objectStoreNames.contains('firstOS')) {
db.createObjectStore('firstOS');
}
~~~
上面代码先判断某个对象仓库是否存在,如果不存在就创建该对象仓库。
## 二、方法
`IDBDatabase`对象有以下方法。
* `IDBDatabase.close()`:关闭数据库连接,实际会等所有事务完成后再关闭。
* `IDBDatabase.createObjectStore()`:创建存放数据的对象仓库,类似于传统关系型数据库的表格,返回一个 IDBObjectStore 对象。该方法只能在`versionchange`事件监听函数中调用。
* `IDBDatabase.deleteObjectStore()`:删除指定的对象仓库。该方法只能在`versionchange`事件监听函数中调用。
* `IDBDatabase.transaction()`:返回一个 IDBTransaction 事务对象。
下面是`createObjectStore()`方法的例子。
~~~
var request = window.indexedDB.open('demo', 2);
request.onupgradeneeded = function (event) {
var db = event.target.result;
db.onerror = function(event) {
console.log('error');
};
var objectStore = db.createObjectStore('items');
// ...
};
~~~
上面代码创建了一个名为`items`的对象仓库,如果该对象仓库已经存在,就会抛出一个错误。为了避免出错,需要用到下文的`objectStoreNames`属性,检查已有哪些对象仓库。
`createObjectStore()`方法还可以接受第二个对象参数,用来设置对象仓库的属性。
~~~
db.createObjectStore('test', { keyPath: 'email' });
db.createObjectStore('test2', { autoIncrement: true });
~~~
上面代码中,`keyPath`属性表示主键(由于主键的值不能重复,所以上例存入之前,必须保证数据的`email`属性值都是不一样的),默认值为`null`;`autoIncrement`属性表示,是否使用自动递增的整数作为主键(第一个数据记录为1,第二个数据记录为2,以此类推),默认为`false`。一般来说,`keyPath`和`autoIncrement`属性只要使用一个就够了,如果两个同时使用,表示主键为递增的整数,且对象不得缺少`keyPath`指定的属性。
下面是`deleteObjectStore()`方法的例子。
~~~
var dbName = 'sampleDB';
var dbVersion = 2;
var request = indexedDB.open(dbName, dbVersion);
request.onupgradeneeded = function(e) {
var db = request.result;
if (e.oldVersion < 1) {
db.createObjectStore('store1');
}
if (e.oldVersion < 2) {
db.deleteObjectStore('store1');
db.createObjectStore('store2');
}
// ...
};
~~~
下面是`transaction()`方法的例子,该方法用于创建一个数据库事务,返回一个`IDBTransaction`对象。向数据库添加数据之前,必须先创建数据库事务。
~~~
var t = db.transaction(['items'], 'readwrite');
~~~
`transaction()`方法接受两个参数:第一个参数是一个数组,里面是所涉及的对象仓库,通常是只有一个;第二个参数是一个表示操作类型的字符串。目前,操作类型只有两种:`readonly`(只读)和`readwrite`(读写)。添加数据使用`readwrite`,读取数据使用`readonly`。第二个参数是可选的,省略时默认为`readonly`模式。
- 第一章:音视频
- 第一节:概述
- 第二节:媒体元素
- 第三节:视频元素
- 第四节:音频元素
- 第四节:事件
- 第二章:高德地图
- 第三章:Storage 接口
- 第一节:概述
- 第二节:属性和方法
- 第三节:事件
- 第四章:IndexedDB
- 第一节:概述
- 第二节:基本概念
- 第三节:indexedDB 对象
- 第四节:IDBRequest 对象
- 第五节:IDBDatabase 对象
- 第六节:IDBObjectStore 对象
- 第七节:IDBTransaction 对象
- 第八节:IDBIndex 对象
- 第九节:IDBCursor 对象
- 第十节:IDBKeyRange 对象
- 第十一节:操作流程
- 第五章:Canvas
- 第一节:概述
- 第二节:绘制图像
- 第一课时:路径
- 第二课时:线型
- 第三课时:矩形
- 第四课时:弧线
- 第五课时:文本
- 第六课时:渐变色和图像填充
- 第七课时:阴影
- 第三节:图像处理
- 第一课时:写入图像
- 第二课时:像素读写
- 第三课时:保存和恢复
- 第四课时:画布
- 第五课时:图像变换
- 第四节:元素方法
- 第一课时:toDataURL()
- 第二课时:toBlob()
- 第五节:使用实例
- 第一课时:动画效果
- 第二课时:像素处理