nosql類型的數(shù)據(jù)存儲(chǔ)方式
不需要寫sql語句
定義
IndexedDB 是一種底層 API,用于在客戶端存儲(chǔ)大量的結(jié)構(gòu)化數(shù)據(jù)
應(yīng)用場景
客戶端(瀏覽器)
大量的數(shù)據(jù)
結(jié)構(gòu)化數(shù)據(jù)(類似 object對(duì)象 有鍵有值)
不是關(guān)系型(通過sql查詢)
存儲(chǔ)位置
瀏覽器中
application中
底層API
操作起來相對(duì)復(fù)雜
可選擇第三方工具
IndexedDB API是強(qiáng)大的烤镐,但對(duì)于簡單的情況可能看起來太復(fù)雜蛋济。如果你更喜歡一個(gè)簡單的API,請(qǐng)嘗試? localForage炮叶、dexie.js碗旅、PouchDB、idb镜悉、idb-keyval祟辟、JsStore 或者 lovefield? 之類的庫,這些庫使 IndexedDB 對(duì)開發(fā)者來說更加友好积瞒。
同源策略
正如大多數(shù)的 web 儲(chǔ)存解決方案一樣川尖,IndexedDB 也遵守同源策略登下。因此當(dāng)你在某個(gè)域名下操作儲(chǔ)存數(shù)據(jù)的時(shí)候茫孔,你不能操作其他域名下的數(shù)據(jù)
事務(wù)型數(shù)據(jù)庫系統(tǒng)(ORM)
所有操作 都是通過事務(wù)對(duì)象(transaction)進(jìn)行操作
使用
1.打開數(shù)據(jù)庫 -> IDBRequest(請(qǐng)求對(duì)象)
open
IDBFactory.open 方法用于打開一個(gè)數(shù)據(jù)庫連接叮喳。本方法立即返回一個(gè) IDBOpenDBRequest 對(duì)象,但打開數(shù)據(jù)庫的操作是異步執(zhí)行的
連接數(shù)據(jù)庫在一個(gè)單獨(dú)的線程中進(jìn)行缰贝,包括以下幾個(gè)步驟
指定數(shù)據(jù)庫已經(jīng)存在時(shí):
等待 versionchange 操作完成馍悟。
如果數(shù)據(jù)庫已計(jì)劃刪除,那等著刪除完成剩晴。
如果已有數(shù)據(jù)庫版本高于給定的 version锣咒,中止操作并返回類型為 VersionError 的 DOMError 。
如果已有數(shù)據(jù)庫版本低于給定的 version赞弥,觸發(fā)一個(gè) versionchange 操作毅整。
如果數(shù)據(jù)庫不存在,創(chuàng)建指定名稱的數(shù)據(jù)庫绽左,將版本號(hào)設(shè)置為給定版本悼嫉,如果給定版本號(hào),則設(shè)置為1拼窥,and no object stores.
創(chuàng)建數(shù)據(jù)庫連接戏蔑。
2.獲得數(shù)據(jù)庫對(duì)象
監(jiān)聽事件獲得(注意 打開數(shù)據(jù)庫是異步)
IDBRequest->result屬性 數(shù)據(jù)庫對(duì)象
upgradeneeded
檢測(cè)到有新版本的時(shí)候觸發(fā)
第一次打開數(shù)據(jù)庫(如果沒有數(shù)據(jù)庫->新建數(shù)據(jù)庫(也可以有多個(gè)數(shù)據(jù)庫))
建ObjectStore(DB.createObjectStore("user",{keyPath:"有唯一值的index"});)
建index(os.createIndex("鍵名","鍵路徑",可選項(xiàng));)
建index
建index
建ObjectStore(note)
建index(title)
建index(createTime)
建index(content)
success
每一次打開都會(huì)調(diào)用
error
3.通過數(shù)據(jù)庫對(duì)象獲得事務(wù)對(duì)象(db.tansaction())
增刪改查
1.獲取事務(wù)對(duì)象
指定權(quán)限
2.獲取你要操作的OS(objecctStore)
3.增刪改查
添加數(shù)據(jù)add()
? ? ? ? let ts = DB.transaction(["hero"],"readwrite");
? ? ? ? let os = ts.objectStore("hero");
? ? ? ? //會(huì)返回一個(gè)IDBRequest
? ? ? ? let request = os.add(data);
? ? ? ? request.onsuccess = ()=>{
? ? ? ? ? ? console.log("添加數(shù)據(jù)成功")
? ? ? ? ? ? loadAll();
? ? ? ? }
? ? ? ? request.onerror = err=>{console.warn(err)}
查詢數(shù)據(jù)
getAll 查詢所有數(shù)據(jù)(ie不支持)
? ? ? ? let os = DB.transaction(["hero"],"readwrite").objectStore("hero");
? ? ? ? let request = os.getAll();
? ? ? ? request.onsuccess = function (){
? ? ? ? ? ? console.log(this.result);
? ?