引用文檔:
HTML5本地存儲——IndexedDB(一:基本使用)
HTML5本地存儲——IndexedDB(二:索引)
IndexedDB API
JavaScript高級程序設計(第三版)
在上一篇文章HTML5本地存儲IndexedDB基礎介紹(-)-數據庫的簡單增刪改查向大家介紹了IndexedDB的簡單增刪改查,這篇文章將主要向大家介紹IndexedDB的游標與索引,通過游標與索引可以使得對于數據的查找更加方便,提高搜索速度
IndexedDB游標查詢:
通過事務transaction
可以根據已知的鍵檢索單個對象,當我們需要檢索多個對象或者遍歷時就需要在事務內部創建游標。游標是指向結果集的指針。與傳統數據庫的查詢不同,游標不提前收集結果。游標指針會先指向結果中的第一項,在接到查找下一項的指令時,才會指向下一項。
在對象存儲空間上調用openCursor()
方法可以創建游標,與IndexedDB
其它操作一樣,openCursor()
方法返回的是IDBRequest
,因此需要在onerror
、onsuccess
事件中處理程序。代碼示例如下:
var store = db.transaction(storename,'readwrite').objectStore(storename);
var request = store.openCursor();//db為IDBDatabase對象
request.onerror = function(e){
}
request.onsuccess = function(e){
console.log('游標開始查詢')
var cursor = e.target.result;
if(cursor){//必須要檢查
console.log(cursor);
cursor.continue();//遍歷了存儲對象中的所有內容
}else{
}
};
從上述代碼中可以看到在onsuccess
事件處理程序中,有兩行代碼分別是:
var cursor = e.target.result
cursor.continue
e.target.result
可以取得存儲空間的下一個對象,當結果集中有下一個對象時,e.target.result
是一個IDBCursor
實例,沒有下一個對象則為空。所以我們在查詢之前都要用if判斷一下是否有這個對象IDBCursor
,下圖為打印出來的cursor
,打印出來的實例有以下幾個屬性:
- direction:表示游標移動的方向
- key:對象的鍵
- value:查找出的對象
- primaryKey:游標使用的鍵,可能是對象鍵,或者是索引鍵(目前尚未建立索引,所以圖中鍵來自于學生的id)
圖中我們看到出現的實例是IDBCursorWithValue
而非上述所說的IDBCursor
,google中控制臺直接打出的就是這樣的情況,官方API文檔說兩者的區別在于IDBCursorWithValue
包含了value
屬性。
cursor.continue
的作用在于使游標移動到結果集的下一項,默認情況下游標只發起一次請求,要想發起另一次請求使游標繼續查找,則需調用continue(key)