IndexedDB数据库
IndexedDB是一種輕量級的nosql數據庫,不需要固定的表結構,通常也不存在連接操作。
在瀏覽器f12下的application下storage下的indexedDB中
indexDB中包含若干個對象倉庫,它類似于關系型數據庫的表格,對象倉庫保存的是數據記錄。每條記錄類似于關系型數據庫的行,但是只有主鍵和數據體兩部分,主鍵用來建立默認的索引,必須是不同的。主鍵可以是數據記錄里面的一個屬性,也可以指定為一個遞增的整數編號
不是所有的瀏覽器都支持indexDB數據庫,所以在使用是最好加一個判斷操作
if(window.indexedDB){//做數據庫操作 }數據庫初始化:
創建或打開數據庫都使用open方法:
其中name是數據庫名稱的字符串,version是數據庫版本號整數,如果省略為當前版本
如果指定的數據庫存在,則打開,否則創建數據庫。indexDB的操作完全是由異步進行的,每一次indexedDB數據庫操作,都需要定義操作在成功或失敗的回調函數
db代表創建或打開數據庫后獲得的數據庫實例,通過實例可以對數據庫作后續操作,onupgradeneeded會在創建數據庫或數據庫版本號升高之后自動觸發,onsuccess是創建或打開數據庫成功之后的回調函數,onupradeneeded會在onsuccess之前調用,onerror是打開或者創建失敗時的回調函數
新建數據庫和打開數據庫時同一個操作,但是新建數據庫之后的操作在upggradeneeded事件的監聽函數里面完成。
對象儲存空間:
indexedDB不是關系數據庫,它使用對象儲存空間(ObjectStore)來儲存數據,它類似于關系數據庫中的表。一個數據庫中可以包含多個對象儲存空間,對象儲存空間使用鍵值對的形式來儲存數據,即每一個數據都由一組鍵和一組值組成,值是一個JSON對象。
使用數據庫實例對象的createObjectStore方法可以創建對象儲存空間,方法如下:
var store = db.createObjectStore(name,optionalParameters); //name是對象儲存空間名字符串,后面的參數可選,代表對象儲存空間中鍵值的選項,是一個json對象配置。 我們可以使用每條記錄中的某個指定字段作為鍵值(keyPath),也可以使用自動生成的遞增數字作為鍵值(keyGenerator),也可以不指定。object鍵的選項 鍵類型 描述 不使用 可以存儲任意任意值,但是每添加一條數據的時候需要指定鍵參數 keyPath 只能儲存JavaScript對象,儲存對象的一個屬性和鍵值相同 keyGenerator 可儲存任意值,當保存新值時,可以自動生成鍵,相當于自動增長列數據庫實例對象的objectStoreName屬性中包含了數據庫所有的對象儲存空間名,在創建對象儲存空間之前,最好先判斷要創建的對象儲存空間是否存在req.onupgraadeneeded = function(event){db = event.target.result;//判斷儲存空間是否存在,沒有就創建if(!db.objectStoreNames.contains("test")){//創建對象儲存空間,鍵值是屬性Nodb.createObjectStore("test",{keyPath:"No"});} } //數據庫新建成功以后,新增一張叫test的表格,主鍵是no主鍵(key)是默認建立索引的屬性,比如,數據記錄時{id:1.name:‘張三’},那么id屬性可以作為主鍵。
主鍵也可以指定為下一層對象的屬性,比如{ foo: {bar: ‘baz’ }}的foo.bar也可以指定為主鍵
如果數據記錄里面沒有合適作為主鍵的屬性,那么可以讓indexedDB自動生成主鍵:
var objectStore = db.createObjectStore('person',{ aautoIncrement : true} );上面的代碼中指定主鍵為一個遞增的整數
索引:
數據庫中的索引是一個表(對象儲存空間)中所包含的值的列表,當indexedDB數據庫需要使用其他屬性(非主鍵)獲取數據時,就要預先創建索引,然后使用索引獲取數據
新建對象倉庫之后,下一步可以新建索引。
req.onupgradeneeded = function(event){db = event.target.result;var objectStore = db.createObjectStore('person',{ keyPath : 'id'});objectStore.createIndex('name','name',{ unique:false });objectStore.createIndex('emaail','email',{ unique:true }); }objectStore.createIndex()的三個參數分別為索引的名稱、索引所在的屬性、配置對象(該屬性是否重復)新增數據:
新增數據指的是向對象倉庫寫入數據記錄。這需要通過事物完成
寫入數據時需要新建一個事物。新建時必須指定表格名稱和操作模式(只讀或者讀寫)。
新建事物以后,通過db.transaction.objectStore方法拿到ObjectStore對象,再通過表格對象的add方法,向表格寫入一條記錄
寫入是一個異步操作,通過監聽連接對象的success事件和error事件,了解是否寫入成功
讀取數據:
讀取數據也是通過事物完成
objectStore.get()方法用于讀取數據,參數是主鍵的值
遍歷數據:
遍歷數據表格的所有記錄,要使用指針對象cursor
新建指針對象的openCursor()方法是一個異步操作,所以要監聽success事件
更新數據:
function update(){var request = db.transaction(['person'],'readwrite').objectStore('person').put({ id:1,name:'李四',age:35,email:'lisi@example.com' });request.onsuccess = function(event){console.log('數據更新失敗');} } update();put()方法字段更新了主鍵為1的記錄
刪除數據:
function remove(){var request = db.transaction(['person'],'readwrite').objectStore('person').delete(1);request.onsuccess = function(event){console.log('數據刪除成功');} } remove();使用索引:
索引的意義在于,可以讓你搜索任意字段,也就是說從任意字段拿到數據記錄,如果不建立索引,默認只能搜索主鍵(從主鍵取值)
假定新建表格的時候對name字段建立了索引
objectStore.createIndex(‘name’,‘name’,{unique:false});
之后就能從name找到對應的數據記錄了
var transaction = db.transactrion(['person'],'readonly'); var store = transaction.objectStore('person'); var index = store.index('name'); var request = index.get('李四'); request.onsuccess = function(e){var result = e.target.result;if(result){console.log(result);}else{console.log('數據不存在');} }完整增刪改查代碼:
增加:
總結
以上是生活随笔為你收集整理的IndexedDB数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改远程桌面3389端口批处理
- 下一篇: python day 105