关于使用indexedDB的本地存储(2)
我又回來了~這幾天估計沒喝茶,每天頭都暈暈的,昨晚上和室友看了素雞7,傷心啊,自己一直都喜歡這個系列,感覺童年真的是漸行漸遠了……
上一篇說到了哪些內容我這里羅列一下
建立和打開數據庫、刪除數據庫、判斷objectStore是否存在和建立一個不同鍵類型的objectStore,此時發現內容好少啊,大部分都是在測試,不過我覺得詳細的測試還是很重要的。
說完了建立一個objectStore,現在我們來說刪除一個objectStore,經過我的測試,這個也是有坑的存在,刪除objectStore必須是在upgradeneeded事件中觸發
在上一篇文中,IDBDatabase對象貼圖里面我們看到了刪除objectStore的API,是deleteObjectStore
request.onsuccess = function(ev){var db = ev.target.result;alert('這里是success');if(db.objectStoreNames.contains('students')){db.deleteObjectStore('students');alert('刪除成功!');}//window.indexedDB.deleteDatabase('test'); 這句不用看 }我的本意是當我點擊clear的時候觸發這段代碼,然后將'students'這個objectStore干掉,誰知道是我被干掉了~報錯如圖~
The database is not running a version change transaction翻譯是
這個數據庫沒有運行在一個版本變動的失誤中,導致了deleteObjectStore失敗
我當時整個人都震驚了,為什么需要這樣。不過既然它這樣說了,我們就讓這個delete行為發生在一個version change中看看
request.onupgradeneeded = function(ev){var db = ev.target.result;if(db.objectStoreNames.contains('students')){db.deleteObjectStore('students');alert('刪除成功!');} }注意:記得window.indexedDB.open(DBname, version)時,version變大,這樣才會觸發upgradeneeded
果然和我們預想的一樣~沒有報錯,成功清除了'students'這個objectStore,也使其所在的test數據庫version變化了,為什么會這樣設計,我也不知道……如果有知道的大神路過,求指點~
這時候我們等于學完了database的相關操作,tables(objectStore)的相關操作,下面就是核心的增刪改查啦
學習增刪改查之前先給大家介紹一個新的名詞就是事務(transaction)
注意:在indexedDB中所有具體的objectStore的操作,都需要通過transaction
事務有三種模式,網上都有,我也把羅列一下
如何獲取一個事務?
var transaction = db.transaction(arg1, arg2); //db是IDBDatabase對象arg1可以使一個字符串=>'students',也可以是一個字符串數組=>['students', 'teachers']
arg2是事務的模式,就是上面羅列的三種
此時得到的transaction是一個IDBTransaction對象,我們console.log輸出看一下
看1,oncomplete,我看到這個第一反應就是這玩意需要異步回調使用,結果我多次測試發現不需要的,得到的transaction可以直接使用,想怎么用就怎么用,比如:
var transaction = db.transaction('students', 'readwrite'); var objectStore = transaction.objectStore('students'); //①,這個方法就是上面紅色箭頭2//根本不需要下面這樣 /*transaction.oncomplete = function(){objectStore = this.objectStore('students');balabalabala.... } */①這里就是通過我們的IDBTransaction對象得到了我們需要操作的objectStore,transaction只是一個幫手,而得到的objectStore才是操作的主體
console.log看看~
注意:indexNames啊,createIndex啊,凡是與index相關的屬性方法,是關于索引的,下一篇再說,這里我們只看1~6這幾個方法
1、add添加數據
var result = objectStore.add({number:99, name:'tt'}); result.onsuccess = function(ev){alert('插入成功!'); }嗯哼,看到這樣寫想起來文章開篇就說的indexedDB的操作是異步的了吧~
注意:add后面的參數只能是對象,不能是數組~
2、clear清空數據
var result = objectStore.clear(); result.onsuccess = function(ev){alert('清空成功!'); }3、count找到存儲數量
var result = objectStore.count(); result.onsuccess = function(ev){alert('數量為' + ev.target.result); }記得通過result屬性得到返回值,再一次提醒異步操作!
4、delete刪除指定數據
var result = objectStore.delete('11'); result.onsuccess = function(ev){alert('key為' + 11 + '已經刪除成功!'); }delete的參數是key值
注意:如果你傳遞給它一個不存在的key值,它同樣觸發success事件,不過數據庫里面沒有變化就是了。比如將'11'改成'aa'
5、get找到數據
var result = objectStore.get('22'); result.onsuccess = function(ev){console.log(ev.target.result); }6、put更新對象
這里比較麻煩,要分兩種情況
①,對象key不一樣時候put,此時相當于add
var result = objectStore.put({number: 'aa', name: 'ggg'}); result.onsuccess = function(ev){alert('put此時的作用和add是一樣一樣的'); }②,已經存在key時put,此時覆蓋原數據
var result = objectStore.put({number: 'aa', name: 'ttt'}); result.onsuccess = function(ev){alert('覆蓋了剛剛put進來的"ggg"'); }?
嗯~這一篇就告一段落啦,感覺自己介紹的還是很詳細的,如果有錯誤請指出,謝謝~
下次介紹indexedDB索引的使用~
轉載于:https://www.cnblogs.com/constructor/p/4422350.html
總結
以上是生活随笔為你收集整理的关于使用indexedDB的本地存储(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何下载EP的各个版本?
- 下一篇: win7将 esc与 capslock