摘要:以下是一個在事件處理程序中創(chuàng)建對象存儲空間的例子上例具有以下作用在回調(diào)之前作用,可以通過訪問到剛剛創(chuàng)建的數(shù)據(jù)庫。
前言:這是一篇譯文(原文),雖然在《高程3》第23章有IDB的更詳細介紹,但是有點過時了,這篇文章基本概括了IDB的簡單知識點,如果需要更詳盡的了解可以參照IDB標準。
簡介HTML5提供的API中包括IndexedDB API。相比web storage API以鍵值對的形式在客戶端存儲數(shù)據(jù),IDB是一種更為成熟的索引數(shù)據(jù)庫。通過使用IDB,可以更好的構(gòu)建離線web應用,并且通過將數(shù)據(jù)存儲在瀏覽器而非服務器一側(cè),降低了服務器和瀏覽器的交互次數(shù),提高了性能。本文主要介紹IDB API的基本概念。
1)背景:什么是IDB?IDB API源于瀏覽器自帶的index database,該數(shù)據(jù)庫包含簡單值和對象的記錄。每個記錄都包含鍵名和以及對應的值,這些值可以是對象或者基本數(shù)據(jù)類型。IDB API有兩種形式:同步或者異步。一般都是使用異步API。IDB API通過window.indexedDB對象實現(xiàn),這個API在各大瀏覽器的支持形式并不統(tǒng)一,一般使用瀏覽器的前綴區(qū)別。
因此,為了實現(xiàn)跨瀏覽器兼容,最好在使用IDB API之前進行一個聲明:
var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;2)創(chuàng)建數(shù)據(jù)庫
在使用IDB之前需要創(chuàng)建一個數(shù)據(jù)庫。由于數(shù)據(jù)庫是異步工作模式,調(diào)用open()方法將會返回一個IDBRequest對象,通過這個對象可以綁定成功或錯誤的事件處理程序。以下是一個實例:
var db; var request = indexedDB.open("TestDatabase"); request.onerror = function(evt) { console.log("Database error code: " + evt.target.errorCode); }; request.onsuccess = function(evt) { db = request.result; };
在上例中,調(diào)用open()創(chuàng)建了名為TestDatabase的IDB數(shù)據(jù)庫。隨后給返回的IDBRequest對象綁定了onerror和onsuccess事件處理程序。在onsuccess回調(diào)函數(shù)中,可以通過IDBRequest對象的 result屬性得到數(shù)據(jù)庫對象,留待隨后使用。
實際上,open()函數(shù)包含的第二個參數(shù)沒有顯式列出,第二個參數(shù)一般是數(shù)據(jù)庫版本號。該參數(shù)用來更改數(shù)據(jù)庫版本,如果數(shù)據(jù)庫版本比參數(shù)表示的版本低,將會觸發(fā)upgradeneeded事件,并在其事件處理程序中改變數(shù)據(jù)庫結(jié)構(gòu)。更改版本號是唯一可以改變數(shù)據(jù)庫結(jié)構(gòu)的方式。
一個IDB數(shù)據(jù)庫可以包含對個對象存儲空間,一個對象存儲空間類似于關(guān)系型數(shù)據(jù)庫(如MySQL中)中的表。可以使用IDBRequest對象的createObjectStore()方法創(chuàng)建對象空間,該方法包含兩個參數(shù),第一個參數(shù)是對象空間的名字,另一個是選項對象,包含keyPath屬性和keyGenerator值,keyPath屬性是空間中要保存的對象的屬性,這個屬性將作為存儲空間的鍵來使用。如果對象中沒有具有確切名字的屬性可以keyPath,可以使用autoIncrement作為keyGeneraotr。autoIncrement可以表示任意對象屬性。
對象存儲空間可以具有進行數(shù)據(jù)檢索的索引,索引可以通過對象存儲空間的createIndex()創(chuàng)建,具有三個參數(shù):索引名、放置索引的屬性名、以及選項對象。以下是一個在ungradeneeded事件處理程序中創(chuàng)建對象存儲空間的例子:
var peopleData = [ { name: "John Dow", email: "john@company.com" }, { name: "Don Dow", email: "don@company.com" } ]; function initDb() { var request = indexedDB.open("PeopleDB", 1); request.onsuccess = function (evt) { db = request.result; }; request.onerror = function (evt) { console.log("IndexedDB error: " + evt.target.errorCode); }; request.onupgradeneeded = function (evt) { var objectStore = evt.currentTarget.result.createObjectStore("people", { keyPath: "id", autoIncrement: true }); objectStore.createIndex("name", "name", { unique: false }); objectStore.createIndex("email", "email", { unique: true }); for (i in peopleData) { objectStore.add(peopleData[i]); } }; }
上例具有以下作用:
1)ongradeneeded在Onsuccess回調(diào)之前作用,可以通過evt.currentTarget.result訪問到剛剛創(chuàng)建的數(shù)據(jù)庫。
2)keyPath屬性“id”在對象中并不存在,因此使用autoincrement產(chǎn)生自增的keyGenerator。
3)在創(chuàng)建索引的時候可以使用unique限制索引值得唯一性。
4)對象存儲空間的add()或put()方法可以添加數(shù)據(jù)。
當創(chuàng)建了對象存儲空間并添加過數(shù)據(jù)之后,自然就需要訪問數(shù)據(jù)。訪問數(shù)據(jù)要通過IDBTransaction對象,這個對象也不具有瀏覽器兼容性,因此要進行跨瀏覽器聲明:
var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;
這個IDBTransaction對象有三種模式:read-only, read/write and snapshot。一般情況下事務默認為可讀模式。取得了事務的索引之后,通過objectStore()方法并傳入存儲空間的名稱,就可以訪問特定的存儲空間,然后就可以通過get()/add()/put()/delete()/clear()方法進行數(shù)據(jù)的檢索、增加、刪除。事務處理是異步響應,因此返回請求對象,對這個請求對象可以綁定onerror、onsuccess和oncomplete事件處理程序。
var transaction = db.transaction("people", IDBTransaction.READ_WRITE); var objectStore = transaction.objectStore("people"); var request = objectStore.add({ name: name, email: email }); request.onsuccess = function (evt) { // do something when the add succeeded };5) 檢索數(shù)據(jù)—游標
通過事務的get()方法可以檢索數(shù)據(jù),但是這需要你事先知道數(shù)據(jù)的keyPath。除此之外還可以通過游標檢索數(shù)據(jù),在事務指定的對象存儲空間上使用openCursor()方法創(chuàng)建游標,該方法也是返回一個請求對象,可以綁定onerror或onsuccess。在onsuccess事件處理程序中通過event.target.result取得存儲空間的下一個對象, 在結(jié)果集中有下一項時,這個屬性中保存一個 IDBCursor 的實例,在沒有下一項時,這個屬性的值為 null。 IDBCursor 的實例有以下幾個屬性。
a) direction:數(shù)值,表示游標移動的方向。默認值為 IDBCursor.NEXT(0),表示下一項。 IDBCursor.NEXT_NO_DUPLICATE(1)表示下一個不重復的項,DBCursor.PREV(2)表示前一項,而IDBCursor.PREV_NO_DUPLICATE 表示前一個不重復的項。
b) key:對象的鍵。
c) value:實際的對象。
d) primaryKey:游標使用的鍵。可能是對象鍵,也可能是索引鍵。
默認情況下,每個游標只發(fā)起一次請求,因此,還需要移動游標實現(xiàn)存儲空間的遍歷。這就依靠下面的方法:
a)continue(key):移動到結(jié)果集中的下一項。參數(shù) key
是可選的,不指定這個參數(shù),游標移動到下一項;指定這個參數(shù),游標會移動到指定鍵的位置。
b)advance(count):向前移動 count 指定的項數(shù)。這兩個方法都會導致游標使用相同的請求,因此相同的 onsuccess
和 onerror 事件處理程序也會得到重用。
一個實例:
var transaction = db.transaction("people", IDBTransaction.READ_WRITE); var objectStore = transaction.objectStore("people"); var request = objectStore.openCursor(); request.onsuccess = function(evt) { var cursor = evt.target.result; if (cursor) { output.textContent += "id: " + cursor.key + " is " + cursor.value.name + " "; cursor.continue(); } else { console.log("No more entries!"); } };
上例在名為people的對象存儲空間上創(chuàng)建事務,然后在該存儲空間上通過openCursor()創(chuàng)建游標,在返回的請求對象上調(diào)用evt.target.result得到對象實例,然后通過對象實例的key和value屬性填充名為output的DIV。最后通過continue()方法進行遍歷。
6) IDB和web storage對比當需要存儲少量的鍵值對數(shù)據(jù)時,web storage比IDB更合適;但是當需要存儲更多數(shù)據(jù)并且需要快速檢索時,使用IDB更合適。兩者是互補的關(guān)系。IDB的標準可以參照這個。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/50210.html
摘要:以下是一個在事件處理程序中創(chuàng)建對象存儲空間的例子上例具有以下作用在回調(diào)之前作用,可以通過訪問到剛剛創(chuàng)建的數(shù)據(jù)庫。 前言:這是一篇譯文(原文),雖然在《高程3》第23章有IDB的更詳細介紹,但是有點過時了,這篇文章基本概括了IDB的簡單知識點,如果需要更詳盡的了解可以參照IDB標準。 簡介 HTML5提供的API中包括IndexedDB API。相比web storage API以鍵值對...
摘要:兼容的正則表達式已經(jīng)實現(xiàn)了很多使用不同解析引擎的正則函數(shù)。中主要有兩個正則解析器一個稱為,另一個稱為兼容正則表達式。在中,每個正則表達式模式都是使用符合格式的字符串。 原文鏈接: Getting Started with PHP Regular Expressions Last-Modified: 2019年5月10日16:23:19譯者注: 本文是面向0正則基礎的phper, 很多...
摘要:前端日報精選精讀個最佳特性翻譯輕量級函數(shù)式編程第章組合函數(shù)之組件類型寫的姿勢中文周二放送面試題詳解知乎專欄譯原生值得學習嗎答案是肯定的掘金個超贊的視覺效果眾成翻譯布局時常見總結(jié)騰訊前端團隊社區(qū)歸檔打地鼠入門學習書籍 2017-08-30 前端日報 精選 精讀《Web fonts: when you need them, when you don’t》10個最佳ES6特性翻譯 -《Jav...
In [1]: from pandas import Series, DataFrame In [2]: import pandas as pd In [3]: obj = Series([4,7,-5,3]) In [4]: obj Out[4]: 0 4 1 7 2 -5 3 3 dtype: int64
閱讀 1121·2023-04-26 02:46
閱讀 624·2023-04-25 19:38
閱讀 639·2021-10-14 09:42
閱讀 1234·2021-09-08 09:36
閱讀 1354·2019-08-30 15:44
閱讀 1319·2019-08-29 17:23
閱讀 2237·2019-08-29 15:27
閱讀 801·2019-08-29 14:15