indexedDB 資料庫主鍵
如果將一個indexedDB資料庫比作地球,那麼其中的每一個物件倉庫就是一個國家。
物件倉庫中的一條資料就是一個國家的公民,而公民又有一個唯一標識其身份的標識。
indexedDB資料庫物件倉庫中的主鍵則扮演著資料唯一身份標識的角色。
首先看一段程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let request = window.indexedDB.open("antzone", 1); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('website')) { let objectStore = db.createObjectStore('website', { keyPath: 'email' }); } } request.onsuccess = (ev) => { let db = ev.target.result; let transaction = db.transaction(['website'], 'readwrite'); transaction.oncomplete = function (event) { console.log('事務完成'); }; transaction.onerror = function (event) { console.log('事務錯誤資訊: ' + transaction.error); }; let objectStore = transaction.objectStore('website'); let objectStoreRequest = objectStore.add({webName:"百度",age:15,email:"baidu@163.com"}); objectStoreRequest.onsuccess = function (event) { console.log('資料新增成功'); }; } </script> </head> <body> <p>物件倉庫的主鍵為email</p> </body> </html>
通過上面程式碼建立或者開啟名為"antzone"的資料庫,進而建立物件倉庫與新增資料。
程式碼執行效果截圖如下:
對於主鍵分析如下:
(1).通過createObjectStore()方法建立物件倉庫,第二個物件引數的keyPath屬性規定主鍵。
(2).keyPath由key與path的組成,顧名思義,它用來規定主鍵的路徑。
(3).keyPath的屬性值是新增資料的一個屬性,也就是說鍵的路徑指向某一個物件屬性。
(4).同一個物件倉庫中的主鍵必須唯一,否則會報錯。
關於createObjectStore()方法的基本用法可以參閱createObjectStore() 建立物件倉庫一章節。
主鍵也可以是自增長的,程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let request = window.indexedDB.open("antzone", 1); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('website')) { let objectStore = db.createObjectStore('website',{autoIncrement:true}); } } request.onsuccess = (ev) => { let db = ev.target.result; let transaction = db.transaction(['website'], 'readwrite'); transaction.oncomplete = function (event) { console.log('事務完成'); }; transaction.onerror = function (event) { console.log('事務錯誤資訊: ' + transaction.error); }; let objectStore = transaction.objectStore('website'); let objectStoreRequest = objectStore.add({webName:"百度",age:15,email:"baidu@163.com"}); objectStoreRequest.onsuccess = function (event) { console.log('資料新增成功'); }; } </script> </head> <body> <p>物件倉庫的主鍵為email</p> </body> </html>
和前面程式碼唯一的區別是,修改了createObjectStore()方法的第二個引數。
[JavaScript] 純文字檢視 複製程式碼let objectStore = db.createObjectStore('website', { keyPath: 'email' }); let objectStore = db.createObjectStore('website',{autoIncrement:true});
會以遞增1的方式自動為資料新增主鍵,autoIncrement的預設值是false。
通常情況下,keyPath與autoIncrement屬性一個存在就能滿足需求,當然兩個也可以同時存在:
[JavaScript] 純文字檢視 複製程式碼let objectStore = db.createObjectStore('website',{ keyPath: 'email', autoIncrement:true }
如果新增資料中具有指定的屬性,則不自動生成鍵值,如果不存在,則自動生成遞增鍵值,填充keyPath指定屬性。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let request = window.indexedDB.open("antzone", 1); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('website')) { let objectStore = db.createObjectStore('website',{ keyPath: 'email', autoIncrement:true }); } } request.onsuccess = (ev) => { let db = ev.target.result; let transaction = db.transaction(['website'], 'readwrite'); transaction.oncomplete = function (event) { console.log('事務完成'); }; transaction.onerror = function (event) { console.log('事務錯誤資訊: ' + transaction.error); }; let objectStore = transaction.objectStore('website'); objectStore.add({webName:"螞蟻部落",age:5,email:"ant@163.com"}); objectStore.add({webName:"百度",age:15}); } </script> </head> <body> <p>物件倉庫的主鍵為email</p> </body> </html>
上述程式碼中,我們依次新增如下資料:
[JavaScript] 純文字檢視 複製程式碼let objectStoreRequest = objectStore.add({webName:"螞蟻部落",age:5,email:"ant@163.com"}); let objectStoreRequest = objectStore.add({webName:"百度",age:15});
程式碼執行效果截圖如下:
程式碼分析如下:
(1).程式碼規定主鍵既可以是email,也可以是自增長數字。
(2).第一個物件直接量,具有email屬性,於是將ant@163.com設定為主鍵。
(3).第二個物件直接量,不具有email屬性,使用自增長數字作為主鍵,所以設定為1。
(4).注意的是,第二個物件直接量被新增了一個email屬性,其值是1。
createObjectStore()方法可以不指定第二個引數,必須在add中指定主鍵的值。
看如下程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let request = window.indexedDB.open("antzone", 1); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('website')) { let objectStore = db.createObjectStore('website'); } } request.onsuccess = (ev) => { let db = ev.target.result; let transaction = db.transaction(['website'], 'readwrite'); transaction.oncomplete = function (event) { console.log('事務完成'); }; transaction.onerror = function (event) { console.log('事務錯誤資訊: ' + transaction.error); }; let objectStore = transaction.objectStore('website'); let objectStoreRequest = objectStore.add({webName:"螞蟻部落",age:5,email:"ant@163.com"},"softwhy"); objectStoreRequest.onsuccess = function (event) { console.log('資料新增成功'); }; } </script> </head> <body> <p>物件倉庫的主鍵為"softwhy"</p> </body> </html>
add()方法第二個引數用於規定主鍵值,程式碼執行效果截圖如下:
上面演示的都是儲存物件,物件倉庫也可以儲存其他資料型別。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let request = window.indexedDB.open("antzone", 1); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('website')) { let objectStore = db.createObjectStore('website',{autoIncrement:true}); } } request.onsuccess = (ev) => { let db = ev.target.result; let transaction = db.transaction(['website'], 'readwrite'); transaction.oncomplete = function (event) { console.log('事務完成'); }; transaction.onerror = function (event) { console.log('事務錯誤資訊: ' + transaction.error); }; let objectStore = transaction.objectStore('website'); let objectStoreRequest = objectStore.add("螞蟻部落"); objectStoreRequest.onsuccess = function (event) { console.log('資料新增成功'); }; } </script> </head> <body> <p>為物件倉庫新增字串</p> </body> </html>
上述程式碼為物件倉庫新增了一個字串"螞蟻部落"。
程式碼執行效果截圖如下:
主鍵採用自增長方式,估計很多朋友會認為,由於新增的是值型別,就無法設定keyPath。
事實這是錯誤的,字串可以臨時包裝成物件,所以可以設定字串所具有的屬性,比如length作為主鍵。
與主鍵比較類似的是索引,具體可以參閱indexedDB資料庫索引一章節。
相關文章
- indexedDB 資料庫 索引Index資料庫索引
- indexedDB 資料庫版本Index資料庫
- IndexedDB 資料庫概述Index資料庫
- IndexedDB 資料庫用法Index資料庫
- IndexedDB 資料庫新增資料Index資料庫
- indexedDB 刪除資料庫Index資料庫
- IndexedDB資料庫介紹Index資料庫
- 資料庫主鍵、從鍵(易懂版)資料庫
- indexedDB 索引與primarykey主鍵區別Index索引
- 資料庫主鍵 ID 生成策略資料庫
- 前端的資料庫:IndexedDB入門前端資料庫Index
- Java MyBatis 插入資料庫返回主鍵JavaMyBatis資料庫
- 顯示資料庫中表的主鍵資料庫
- 不要使用業務鍵作為資料庫主鍵資料庫
- indexedDB 刪除物件倉庫所有資料Index物件
- 瀏覽器資料庫 IndexedDB(一) 概述瀏覽器資料庫Index
- indexedDB 更新資料Index
- indexedDB 新增資料Index
- 資料庫主鍵設計之思考(ZT)資料庫
- IndexedDB.open()開啟與新建資料庫Index資料庫
- IndexedDB.open() 開啟與新建資料庫Index資料庫
- 瀏覽器資料庫 IndexedDB 入門教程瀏覽器資料庫Index
- HTML5 進階系列:indexedDB 資料庫HTMLIndex資料庫
- 菜鳥學資料庫(四)——超鍵、候選鍵、主鍵、外來鍵資料庫
- mybatis oracle資料庫批次插入資料,忽略主鍵重複MyBatisOracle資料庫
- 資料庫模型設計——主鍵的設計資料庫模型
- indexedDB 遍歷資料Index
- indexedDB 查詢資料Index
- indexedDB 刪除資料Index
- indexedDB 批量新增資料Index
- indexedDB 內鍵與外來鍵Index
- 獲取不同資料庫新增記錄主鍵值資料庫
- 用IndexedDB+Cookie實現HTML5本地資料庫關鍵詞檢索IndexCookieHTML資料庫
- 當資料庫表無主鍵ID時,ORM這樣更新資料資料庫ORM
- 資料庫約束 主鍵-唯一性-Check-外來鍵資料庫
- 使用Hashids來保護你的資料庫主鍵資料庫
- 資料庫自增主鍵可能產生的問題資料庫
- MySQL 資料庫自增主鍵生成的優缺點MySql資料庫