## 第五節: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()
- 第五節:使用實例
- 第一課時:動畫效果
- 第二課時:像素處理