HTML5 Indexed Database API 入門(14) - 索引建立與刪除

HTML5 Indexed Database API 入門系列

IDBObjectStore 物件所定義的 createIndex() 方法支援索引物件的建立,其定義如下:

IDBIndex createIndex (
DOMString name,
any keyPath,
optional IDBIndexParameters optionalParameters);

參數 name 為所要建立的新索引名稱,第二個參數 keyPath 則是索引的資料欄位鍵值路徑,最後的參數 optionalParameters 是 IDBIndexParameters 型態的 dictionary 物件,其定義如下:

dictionary IDBIndexParameters {
  boolean unique = false;
  boolean multiEntry = false;
};

布林值 unique預設值為 false ,如果 unique 被設定為 true ,強迫索引中沒有任何記錄有相同的鍵值,因為如此的限制,導致新增或是修正任何記錄時,要避免新的記錄產生與目前記錄相同的鍵值,否則會導致資料的儲存失敗。

建立索引必須在調整資料庫版本的交易事件中進行,因此調用 createIndex() 可能觸發 InvalidStateError 例外,這個例外也會在來源物件被刪除時發生,而另外還有一個 ConstraintError 例外,發生於嘗試建立相同名稱的索引物件。

以下的程式碼建立索引。

 function addIDX() {
            version++;               
            var request = indexedDB.open(requestName, version);
            request.onupgradeneeded = function (event) {                  
                    db = event.target.result;
                    var objectStore = db.createObjectStore(objectStoreNamerin);
                    // name 要建立的索引名稱
                    // keyPath 要建立的索引鍵值路徑
                    objectStore.createIndex(name, keyPath);                        
            }
 }

其中建立一個新的物件倉儲,接下來以此調用 createIndex(),建立一個新的索引物件。

我們很有可能在現有的物件倉儲中,建立新的索引物件,甚至刪除已經存在的特定索引物件,而這必須透過版本升級交易物件所取得的物件倉儲中,進行處理,刪除索引物件的方法如下:

void deleteIndex(DOMString indexName);

參數 indexName 為所要刪除的索引物件名稱,這個方法執行完畢之後, indexName 名稱的索引物件即從物件倉儲中被刪除。考慮以下兩段程式碼:

        function createIDX() {            
            var request = indexedDB.open(requestName, version);
            request.onupgradeneeded = function (event) {              
                    db = event.target.result;
                    var transaction = event.target.transaction;
                    var store = transaction.objectStore(objectStoreName);
                    // name 要建立的索引名稱
                    // keyPath 要建立的索引鍵值路徑

                    store.createIndex(name, keyPath);  
            }
        }
        function deleteIDX() {
       
            var request = indexedDB.open(requestName, version);
            request.onupgradeneeded = function (event) {        
                    db = event.target.result;
                    var transaction = event.target.transaction;
                    var store = transaction.objectStore(objectStoreName);
                     // name 要刪除的索引名稱
                    store.deleteIndex(name);  
            }         
        }

函式createIDX() 取得交易物件,並且透過此物件取得欲建立索引之物件倉儲,調用createIndex() 方法完成新增作業。函式 deleteIDX() 則透過交易物件取得物件倉儲,最後調用 deleteIndex() 方法進行索引刪除作業。

HTML5 Indexed Database API 入門系列

沒有留言: