IndexedDB æ¯ä¸ç§å¨ç¨æ·æµè§å¨å æä¹ åå卿°æ®çæ¹æ³ãå®å¯ä»¥è®©ä½ åå»ºå ·æä¸°å¯æ¥è¯¢è½åç Web åºç¨ï¼èæ éèèç½ç»å¯ç¨æ§ï¼å æ¤ä½ çåºç¨å¨å¨çº¿å离线æ¶é½å¯ä»¥æ£å¸¸è¿è¡ã
å ³äºæ¬ææ¡£æ¬ç¯æç¨å°æå¯¼ä½ å¦ä½ä½¿ç¨ IndexedDB ç弿¥ APIãå¦æä½ å¯¹ IndexedDB è¿ä¸çæï¼ä½ åºè¯¥é¦å é 读æç« ï¼IndexedDB çå ³é®ç¹æ§ååºæ¬æ¯è¯ã
æå ³ IndexedDB API çåèæåï¼è¯·åè§ IndexedDB API è¿ç¯æç« åå ¶å页é¢ãæç« å å®¹å æ¬ IndexedDB 使ç¨ç对象类åï¼ä»¥å弿¥ APIï¼åæ¥ API å·²ä»è§èä¸å é¤ï¼çæ¹æ³ã
åºæ¬æ¨¡å¼IndexedDB é¼å±ä½¿ç¨çåºæ¬æ¨¡å¼å¦ä¸æç¤ºï¼
æäºè¿äºæçº²ï¼æä»¬å¯ä»¥è¿è¡æ´å ·ä½çæ¢è®¨ã
çæåæå»ºä¸ä¸ªå¯¹è±¡åå¨ æå¼æ°æ®åºæä»¬åä¸é¢è¿æ ·å¼å§æ´ä¸ªè¿ç¨ï¼
// æå¼æä»¬çæ°æ®åº
const request = window.indexedDB.open("MyTestDatabase", 3);
çå°äºåï¼æå¼æ°æ®åºå°±åä»»ä½å ¶ä»æä½ä¸æ ·ââä½ å¿ é¡»è¿è¡â请æ±âã
open 请æ±ä¸ä¼ç«å³æå¼æ°æ®åºæè
å¼å§ä¸ä¸ªäºå¡ã对 open()
彿°çè°ç¨ä¼è¿åä¸ä¸ªæä»¬å¯ä»¥ä½ä¸ºäºä»¶æ¥å¤ççå
å«ç»æï¼resultï¼å¦ææåçè¯ï¼æè
é误å¼ç IDBOpenDBRequest
对象ãå¨ IndexedDB ä¸ç大é¨å弿¥æ¹æ³åç齿¯åæ ·çäºæ
ââè¿åä¸ä¸ªå
å«ç»ææé误ç IDBRequest
对象ãopen 彿°çç»ææ¯ä¸ä¸ª IDBDatabase
对象çå®ä¾ã
open æ¹æ³çäºä¸ªåæ°æ¯æ°æ®åºççæ¬å·ãæ°æ®åºççæ¬å³å®äºæ°æ®åºæ¨¡å¼ï¼schemaï¼ï¼å³æ°æ®åºç对象åå¨ï¼object storeï¼ä»¥ååå¨ç»æãå¦ææ°æ®åºä¸åå¨ï¼open
æä½ä¼åå»ºè¯¥æ°æ®åºï¼ç¶å触å onupgradeneeded
äºä»¶ï¼ä½ éè¦å¨è¯¥äºä»¶çå¤çå¨ä¸åå»ºæ°æ®åºæ¨¡å¼ãå¦ææ°æ®åºå·²ç»åå¨ï¼ä½ä½ æå®äºä¸ä¸ªæ´é«çæ°æ®åºçæ¬ï¼ä¼ç´æ¥è§¦å onupgradeneeded
äºä»¶ï¼å
è®¸ä½ å¨å¤çå¨ä¸æ´æ°æ°æ®åºæ¨¡å¼ãæä»¬å¨åé¢çåå»ºææ´æ°æ°æ®åºççæ¬å IDBFactory.open
åè页ä¸ä¼æå°æ´å¤æå
³è¿æ¹é¢çå
容ã
è¦åï¼ çæ¬å·æ¯ä¸ä¸ª unsigned long long
æ°åï¼è¿æå³çå®å¯ä»¥æ¯ä¸ä¸ªç¹å«å¤§çæ°åï¼ä¹æå³çä¸è½ä½¿ç¨æµ®ç¹æ°ï¼å¦åå®å°ä¼è¢«è½¬æ¢æä¸è¶
è¿å®çæè¿æ´æ°ï¼è¿å¯è½å¯¼è´äºå¡æ æ³å¯å¨ï¼upgradeneeded
äºä»¶ä¹ä¸ä¼è¢«è§¦åãä¾å¦ï¼ä¸è¦ä½¿ç¨ 2.4 ä½ä¸ºçæ¬å·ï¼const request = indexedDB.open("MyTestDatabase", 2.4); // ä¸è¦è¿ä¹åï¼å ä¸ºçæ¬ä¼è¢«åæ´ä¸º 2
å¯¹äºæä»¬äº§ççå 乿æç请æ±ï¼æä»¬é¦å è¦åçå°±æ¯æ·»å æåå失败å¤çå¨ï¼
request.onerror = (event) => {
// ä½¿ç¨ request.errorCode æ¥åç¹ä»ä¹ï¼
};
request.onsuccess = (event) => {
// ä½¿ç¨ request.result æ¥åç¹ä»ä¹ï¼
};
onsuccess()
å onerror()
è¿ä¸¤ä¸ªå½æ°åªä¸ªè¢«è°ç¨å¢ï¼å¦æä¸å顺å©çè¯ï¼ä¼è§¦å success äºä»¶ï¼å³ä¸ä¸ª type
屿§è¢«è®¾ç½®æ "success"
ç DOM äºä»¶ï¼ï¼å¹¶å° request
设置为å®ç target
ã䏿¦å®è¢«è§¦åï¼ç¸å
³ request
ç onsuccess()
彿°å°±ä¼è¢«è§¦åï¼ä½¿ç¨ success äºä»¶ä½ä¸ºå®çåæ°ãå¦åï¼å¦ææä»»ä½é误çè¯ï¼error äºä»¶ï¼å³ type
屿§è¢«è®¾ç½®æ "error"
ç DOM äºä»¶ï¼ä¼å¨ request
ä¸è¢«è§¦åãè¿å°ä¼è§¦åä½¿ç¨ error äºä»¶ä½ä¸ºåæ°ç onerror()
彿°ã
IndexedDB API 以满足尽å¯è½å°åå°å¯¹é误å¤ççéæ±èè®¾è®¡ï¼æä»¥ä½ å¯è½ä¸ä¼çå°æå¾å¤çé误äºä»¶ï¼è³å°ï¼ä¸ä¼å¨ä½ å·²ç»ä¹ æ¯äºè¿äº API ä¹åï¼ï¼ãç¶è卿弿°æ®åºçæ åµä¸ï¼è¿æ¯æä¸äºä¼äº§çé误äºä»¶çå¸¸è§æ åµãææå¯è½åºç°çé®é¢æ¯ç¨æ·å³å®ä¸å è®¸ä½ ç web åºç¨åå»ºæ°æ®åºãIndexedDB ç主è¦è®¾è®¡ç®æ ä¹ä¸å°±æ¯å è®¸å¤§éæ°æ®å¯ä»¥è¢«åå¨ä»¥ä¾ç¦»çº¿ä½¿ç¨ãï¼è¦äºè§£å ³äºé对æ¯ä¸ªæµè§å¨ä½ å¯ä»¥æå¤å°åå¨ç©ºé´çæ´å¤å 容ï¼è¯·åè§æµè§å¨åå¨éå¶åæ¸ çæ å页é¢çæ°æ®åå¨éå¶ï¼ã
æ¾ç¶ï¼æµè§å¨ä¸å¸æå 许æäºå¹¿åç½ç»ææ¶æç½ç«æ¥æ±¡æä½ çè®¡ç®æºï¼æä»¥æµè§å¨ä¼å¨ä»»æç»å®ç web åºç¨é¦æ¬¡å°è¯æå¼ IndexedDB 以å卿°æ®æ¶å¯¹ç¨æ·è¿è¡æéãç¨æ·å¯ä»¥éæ©å è®¸è®¿é®æè æç»è®¿é®ãæ¤å¤ï¼æµè§å¨çéç§æ¨¡å¼ï¼Firefox çéç§æµè§æ¨¡å¼å Chrome çæ çæ¨¡å¼ï¼ä½æªè³ 2021 å¹´ 5 æï¼Firefox å°æªå®ç°æ¤ç¹æ§ï¼æä»¥ä½ ä»ç¶æ æ³å¨ Firefox çéç§æµè§ä¸ä½¿ç¨ IndexedDBï¼ä¸ï¼IndexedDB åå¨ä» å¨å åä¸åå¨è³éç§ä¼è¯ç»æã
ç°å¨ï¼åè®¾ç¨æ·å·²ç»å
许äºä½ çè¦åå»ºæ°æ®åºç请æ±ï¼åæ¶ä½ ä¹å·²ç»æ¶å°äºä¸ä¸ªè§¦åäº success åè°ç success äºä»¶ï¼ç¶åå¢ï¼è¿éç请æ±ï¼requestï¼æ¯éè¿è°ç¨ indexedDB.open()
产ççï¼æä»¥ request.result
æ¯ä¸ä¸ª IDBDatabase
çå®ä¾ï¼èä¸ä½ è¯å®å¸æå°å
¶ä¿å䏿¥ä»¥ä¾åç»ä½¿ç¨ãä½ ç代ç çèµ·æ¥å¯è½åè¿æ ·ï¼
let db;
const request = indexedDB.open("MyTestDatabase");
request.onerror = (event) => {
console.error("为ä»ä¹ä¸å
许æç web åºç¨ä½¿ç¨ IndexedDBï¼");
};
request.onsuccess = (event) => {
db = event.target.result;
};
é误å¤ç
å¦ä¸ææè¿°ï¼é误äºä»¶éµå¾ªå泡æºå¶ãé误äºä»¶é½æ¯é对产çè¿äºé误ç请æ±çï¼ç¶åäºä»¶å泡å°äºå¡ï¼ç¶åæç»å°è¾¾æ°æ®åºå¯¹è±¡ãå¦æä½ å¸æé¿å 为ææç请æ±é½å¢å é误å¤çç¨åºï¼ä½ å¯ä»¥ä» å¯¹æ°æ®åºå¯¹è±¡æ·»å é误å¤çå¨ï¼åè¿æ ·ï¼
db.onerror = (event) => {
// éå¯¹æ¤æ°æ®åºè¯·æ±çææé误çéç¨é误å¤çå¨ï¼
console.error(`æ°æ®åºé误ï¼${event.target.errorCode}`);
};
卿弿°æ®åºæ¶å¸¸è§çå¯è½åºç°çé误ä¹ä¸æ¯ VER_ERR
ãè¿è¡¨æåå¨å¨ç£çä¸çæ°æ®åºççæ¬é«äºä½ è¯å¾æå¼ççæ¬ãè¿æ¯ä¸ç§å¿
é¡»è¦è¢«é误å¤çå¨å¤ççä¸ç§åºéæ
åµã
å½ä½ å建ä¸ä¸ªæ°çæ°æ®åºæè
å¢å å·²åå¨çæ°æ®åºççæ¬å·ï¼å½æå¼æ°æ®åºæ¶ï¼æå®ä¸ä¸ªæ¯ä¹åæ´å¤§ççæ¬å·ï¼ï¼ä¼è§¦å onupgradeneeded
äºä»¶ï¼IDBVersionChangeEvent 对象ä¼ä½ä¸ºåæ°ä¼ éç»ç»å®å¨ request.result
ï¼ä¾å¦ç¤ºä¾ä¸ç db
ï¼ä¸ç onversionchange
äºä»¶å¤çå¨ãå¨ upgradeneeded
äºä»¶çå¤çå¨ä¸ï¼ä½ åºè¯¥åå»ºè¯¥æ°æ®åºçæ¬éè¦ç对象åå¨ï¼object storeï¼ï¼
// 该äºä»¶ä»
卿æ°çæµè§å¨ä¸å®ç°
request.onupgradeneeded = (event) => {
// ä¿å IDBDatabase æ¥å£
const db = event.target.result;
// ä¸ºæ°æ®åºå建对象åå¨ï¼objectStoreï¼
const objectStore = db.createObjectStore("name", { keyPath: "myKey" });
};
å¨è¿ç§æ
åµä¸ï¼æ°æ®åºä¼ä¿çä¹åçæ¬æ°æ®åºç对象åå¨ï¼å æ¤ä½ ä¸å¿
忬¡å建è¿äºå¯¹è±¡åå¨ãä½ éè¦å建æ°ç对象åå¨ï¼æå é¤ä¸åéè¦çä¸ä¸çæ¬ä¸ç对象åå¨ãå¦æä½ éè¦ä¿®æ¹ä¸ä¸ªå·²åå¨ç对象åå¨ï¼ä¾å¦è¦ä¿®æ¹ keyPath
ï¼ï¼ä½ å¿
é¡»å
å é¤åå
ç对象åå¨ï¼ç¶åä½¿ç¨æ°çé项忬¡å建ãï¼æ³¨æï¼è¿æ ·ä¼ä¸¢å¤±å¯¹è±¡åå¨ä¸çæ°æ®ï¼å¦æä½ éè¦ä¿åè¿äºä¿¡æ¯ï¼ä½ è¦å¨æ°æ®åºçæ¬æ´æ°å读ååºæ¥å¹¶ä¿åå¨å«å¤ï¼ã
å°è¯å建ä¸ä¸ªä¸å·²åå¨ï¼éåï¼ç对象åå¨ï¼æå é¤ä¸ä¸ªä¸åå¨ç对象åå¨ï¼ä¼æåºé误ã
妿 onupgradeneeded
äºä»¶æåæ§è¡å®æï¼æå¼æ°æ®åºè¯·æ±ç onsuccess
å¤çå¨ä¼è¢«è§¦åã
ç°å¨è®©æä»¬æå»ºæ°æ®åºãIndexedDB 使ç¨å¯¹è±¡åå¨è䏿¯è¡¨ï¼å¹¶ä¸ä¸ä¸ªæ°æ®åºå¯ä»¥å å«ä»»ææ°éç对象åå¨ãæ¯å½ä¸ä¸ªå¼è¢«åå ¥ä¸ä¸ªå¯¹è±¡å卿¶ï¼å®ä¼ä¸ä¸ä¸ªé®ç¸å ³èãé®çæä¾å¯ä»¥æå ç§ä¸åçæ¹æ³ï¼è¿åå³äºå¯¹è±¡å卿¯ä½¿ç¨é®è·¯å¾ è¿æ¯é®çæå¨ã
ä¸é¢çè¡¨æ ¼æ¾ç¤ºäºå ç§ä¸åçæä¾é®çæ¹æ³ã
é®è·¯å¾ï¼keyPath
ï¼ é®çæå¨ï¼autoIncrement
ï¼ æè¿° ç¦ç¨ ç¦ç¨ è¿ç§å¯¹è±¡åå¨å¯ä»¥ä¿åä»»æç±»åçå¼ï¼çè³æ¯åæ°ååå符串è¿ç§åå§å¼ãæ¯å½æä»¬æ³è¦å¢å ä¸ä¸ªæ°å¼çæ¶åï¼å¿
é¡»æä¾ä¸ä¸ªåç¬çé®åæ°ã å¯ç¨ ç¦ç¨ è¿ç§å¯¹è±¡åå¨åªè½ä¿å JavaScript 对象ãè¿äºå¯¹è±¡å¿
é¡»å
·æä¸ä¸ªåé®è·¯å¾ååç屿§ã ç¦ç¨ å¯ç¨ è¿ç§å¯¹è±¡åå¨å¯ä»¥ä¿åä»»æç±»åçå¼ãé®ä¼ä¸ºæä»¬èªå¨çæï¼æè
å¦æä½ æ³è¦ä½¿ç¨ä¸ä¸ªç¹å®é®çè¯ä½ å¯ä»¥æä¾ä¸ä¸ªåç¬çé®åæ°ã å¯ç¨ å¯ç¨ è¿ç§å¯¹è±¡åå¨åªè½ä¿å JavaScript 对象ãé常ä¸ä¸ªé®è¢«çæçåæ¶ï¼çæçé®çå¼ä¼è¢«åå¨å¨å¯¹è±¡ä¸çä¸ä¸ªåé®è·¯å¾ååç屿§ä¸ãç¶èï¼å¦æå·²åå¨è¯¥å±æ§ï¼è¯¥å±æ§çå¼å°è¢«ç¨ä½é®èä¸ä¼çæä¸ä¸ªæ°çé®ã
å¨å¯¹è±¡åå¨ä¿åäºå¯¹è±¡ï¼è䏿¯åå§å¼çæ åµä¸ï¼ä½ å¯ä»¥å¨ä»»ä½å¯¹è±¡åå¨ä¸å建索å¼ãç´¢å¼å¯ä»¥è®©ä½ 使ç¨è¢«åå¨ç对象ç屿§ç弿¥æ¥æ¾åå¨å¨å¯¹è±¡åå¨ä¸çå¼ï¼è䏿¯ç¨å¯¹è±¡ç鮿¥æ¥æ¾ã
æ¤å¤ï¼ç´¢å¼å ·æå¯¹åå¨çæ°æ®æ§è¡ç®å约æçè½åãéè¿å¨åå»ºç´¢å¼æ¶è®¾ç½® unique æ å¿ï¼ç´¢å¼å¯ä»¥ç¡®ä¿ä¸ä¼æä¸¤ä¸ªå ·æç¸åç´¢å¼é®è·¯å¾å¼ç对象被å¨åãå æ¤ï¼ä¾å¦ï¼å¦æä½ æä¸ä¸ªç¨äºåå¨ä¸ç»ä¸ªäººä¿¡æ¯ç对象åå¨ï¼å¹¶ä¸ä½ æ³è¦ç¡®ä¿ä¸ä¼æä¸¤ä¸ªæ¥æåæ ·çµåé®ä»¶å°åç个人信æ¯ï¼ä½ å¯ä»¥ä½¿ç¨ä¸ä¸ªå¸¦æ unique æ å¿çç´¢å¼æ¥ç¡®ä¿è¿äºã
è¿å¬èµ·æ¥å¯è½æç¹æ··ä¹±ï¼ä½ä¸é¢è¿ä¸ªç®åç示ä¾åºè¯¥å¯ä»¥è§£éè¿äºæ¦å¿µãé¦å ï¼æä»¬å®ä¹ä¸äºå°å¨ç¤ºä¾ä¸ç¨å°çå®¢æ·æ°æ®ï¼
// æä»¬çå®¢æ·æ°æ®çèµ·æ¥åè¿æ ·ã
const customerData = [
{ ssn: "444-44-4444", name: "Bill", age: 35, email: "bill@company.com" },
{ ssn: "555-55-5555", name: "Donna", age: 32, email: "donna@home.org" },
];
å½ç¶ï¼ä½ ä¸ä¼ä½¿ç¨äººä»¬ç社ä¼ä¿é©å·ï¼ssnï¼ä½ä¸ºå®¢æ·è¡¨ç主é®ï¼å ä¸ºä¸æ¯æ¯ä¸ªäººé½æ¥æç¤¾ä¼ä¿é©å·ï¼å¹¶ä¸ä½ åºè¯¥åå¨ä»ä»¬ççæ¥è䏿¯å¹´é¾ãä¸ºäºæ¹ä¾¿ï¼è¿éæä»¬å¿½ç¥è¿äºä¸åçç设计ï¼ç»§ç»å¾ä¸çã
ç°å¨è®©æä»¬ççå¦ä½å建ä¸ä¸ª IndexedDB æ¥åå¨æä»¬çæ°æ®ï¼
const dbName = "the_name";
const request = indexedDB.open(dbName, 2);
request.onerror = (event) => {
// é误å¤ç
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
// å建ä¸ä¸ªå¯¹è±¡å卿¥å卿们客æ·çç¸å
³ä¿¡æ¯ï¼æä»¬å°âssnâä½ä¸ºé®è·¯å¾
// å 为 ssn å¯ä»¥ä¿è¯æ¯ä¸éå¤çââæè³å°å¨å¯å¨é¡¹ç®çä¼è®®ä¸æä»¬æ¯è¿æ ·è¢«åç¥çã
const objectStore = db.createObjectStore("customers", { keyPath: "ssn" });
// å建ä¸ä¸ªç´¢å¼ä»¥éè¿å§åæ¥æç´¢å®¢æ·ãååå¯è½ä¼éå¤ï¼æä»¥æä»¬ä¸è½ä½¿ç¨ unique ç´¢å¼ã
objectStore.createIndex("name", "name", { unique: false });
// 使ç¨é®ç®±å»ºç«ç´¢å¼ï¼æä»¬æ³ç¡®ä¿å®¢æ·çé®ç®±ä¸ä¼éå¤ï¼æä»¥æä»¬ä½¿ç¨ unique ç´¢å¼ã
objectStore.createIndex("email", "email", { unique: true });
// 使ç¨äºå¡ç oncomplete äºä»¶ç¡®ä¿å¨æå
¥æ°æ®å对象åå¨å·²ç»åå»ºå®æ¯ã
objectStore.transaction.oncomplete = (event) => {
// å°æ°æ®ä¿åå°æ°å建ç对象åå¨ä¸ã
const customerObjectStore = db
.transaction("customers", "readwrite")
.objectStore("customers");
customerData.forEach((customer) => {
customerObjectStore.add(customer);
});
};
};
æ£å¦å颿å°çï¼onupgradeneeded
æ¯æä»¬å¯ä¸å¯ä»¥ä¿®æ¹æ°æ®åºç»æçå°æ¹ãå¨è¿éé¢ï¼æä»¬å¯ä»¥å建åå é¤å¯¹è±¡åå¨ä»¥åå建åå é¤ç´¢å¼ã
对象åå¨ä»
è°ç¨ createObjectStore()
å°±å¯ä»¥å建ãè¿ä¸ªæ¹æ³æ¥ååå¨çåç§°åä¸ä¸ªåæ°å¯¹è±¡ãå³ä¾¿è¿ä¸ªåæ°å¯¹è±¡æ¯å¯éçï¼å®è¿æ¯é常éè¦çï¼å 为å®å¯ä»¥è®©ä½ å®ä¹éè¦çå¯é屿§ï¼å¹¶å®åä½ å¸æå建ç对象åå¨çç±»åã卿们ç示ä¾ä¸ï¼æä»¬å建äºä¸ä¸ªå为âcustomersâç对象åå¨ï¼å¹¶ä¸å®ä¹äºä¸ä¸ªä½¿å¾æ¯ä¸ªåå¨ä¸æ¯ä¸ªå¯¹è±¡é½ç¬ä¸æ äºç keyPath
ãè¿ä¸ªç¤ºä¾ä¸ç屿§æ¯âssnâï¼å 为社ä¼å®å
¨å·ç è¢«ç¡®ä¿æ¯å¯ä¸çã被åå¨å¨ objectStore
ä¸çææå¯¹è±¡é½å¿
é¡»åå¨âssnâã
æä»¬è¿å建äºä¸ä¸ªå为ânameâçæ¥è¯¢åå¨å¯¹è±¡ç name
屿§çç´¢å¼ãå¦å createObjectStore()
ï¼createIndex()
æ¥åä¸ä¸ªå¯éç options
对象ï¼è¯¥å¯¹è±¡ç»åäºæä»¬å¸æå建çç´¢å¼ç±»åãæ°å¢ä¸ä¸ªä¸å¸¦ name
屿§ç对象ä¹ä¼æåï¼ä½æ¯è¿ä¸ªå¯¹è±¡ä¸ä¼åºç°å¨ânameâç´¢å¼ä¸ã
æä»¬ç°å¨å¯ä»¥ä½¿ç¨åå¨ç客æ·å¯¹è±¡ç ssn
ç´æ¥ä»å¯¹è±¡åå¨ä¸æ£ç´¢å®ä»¬ï¼æè
éè¿ä½¿ç¨ç´¢å¼æ¥ä½¿ç¨å®ä»¬ç name è¿è¡æ¥è¯¢ãè¦äºè§£è¿äºæ¯å¦ä½å®ç°çï¼è¯·åè§ä½¿ç¨ç´¢å¼é¨åã
å¨å建对象å卿¶è®¾ç½® autoIncrement
æ å¿ä¼ä¸ºå¯¹è±¡åå¨å¼å¯é®çæå¨ãè¿ä¸ªæ å¿é»è®¤æ¯ä¸å¼å¯çã
使ç¨é®çæå¨ï¼å½ä½ å对象å卿°å¢è®°å½æ¶é®ä¼èªå¨çæã对象åå¨çæçé®å¾å¾ä» 1 å¼å§ï¼ç¶åèªå¨çæçæ°çé®ä¼å¨ä¹åçé®çåºç¡ä¸å 1ãçæçé®çå¼ä»æ¥ä¸ä¼åå°ï¼é¤éæ°æ®åºæä½ç»æè¢«åæ»ï¼æ¯å¦ï¼æ°æ®åºäºå¡è¢«ä¸æãå æ¤å é¤ä¸æ¡è®°å½ï¼çè³æ¸ 空对象åå¨éçææè®°å½é½ä¸ä¼å½±å对象åå¨çé®çæå¨ã
æä»¬å¯ä»¥ä½¿ç¨é®çæå¨å建ä¸ä¸ªå¯¹è±¡åå¨ï¼
// æå¼ indexedDBã
const request = indexedDB.open(dbName, 3);
request.onupgradeneeded = (event) => {
const db = event.target.result;
// å建å¦ä¸ä¸ªå为ânamesâç对象åå¨ï¼å¹¶å° autoIncrement æ å¿è®¾ç½®ä¸ºçã
const objStore = db.createObjectStore("names", { autoIncrement: true });
// å 为ânamesâ对象å卿¥æé®çæå¨ï¼æä»¥å®çé®ä¼èªå¨çæã
// æ·»å çè®°å½å°ç±»ä¼¼äºï¼
// é®ï¼1 => å¼ï¼"Bill"
// é®ï¼2 => å¼ï¼"Donna"
customerData.forEach((customer) => {
objStore.add(customer.name);
});
};
æ´å¤æå ³é®çæå¨ç详ç»ä¿¡æ¯ï¼è¯·åé âW3C é®çæå¨âã
å¢å ã读ååå 餿°æ®ä½ éè¦å¼å¯ä¸ä¸ªäºå¡æè½å¯¹ä½ åå»ºçæ°æ®åºè¿è¡æä½ãäºå¡æ¥èªäºæ°æ®åºå¯¹è±¡ï¼èä¸ä½ å¿
é¡»æå®ä½ æ³è®©è¿ä¸ªäºå¡è·¨è¶åªäºå¯¹è±¡åå¨ã䏿¦ä½ å¤äºä¸ä¸ªäºå¡ä¸ï¼ä½ å°±å¯ä»¥è®¿é®ç¨äºä¿åæ°æ®ç对象åå¨ï¼å¹¶ååºè¯·æ±ãæ¥ä¸æ¥ï¼ä½ è¦å³å®æ¯å¯¹æ°æ®åºè¿è¡æ´æ¹è¿æ¯åªéä»ä¸è¯»åæ°æ®ãäºå¡æä¾äºä¸ç§æ¨¡å¼ï¼readonly
ãreadwrite
å versionchange
ã
å¿
é¡»å¨ versionchange
äºå¡ä¸æè½ä¿®æ¹æ°æ®åºçâæ¨¡å¼âæç»æï¼å
æ¬æ°å»ºæå é¤å¯¹è±¡åå¨ãç´¢å¼ï¼ã该äºå¡ç±ä¸ä¸ªæå®äº version ç IDBFactory.open
æ¹æ³å¯å¨ã
ä½¿ç¨ readonly
æ readwrite
模å¼é½å¯ä»¥ä»å·²åå¨ç对象åå¨é读åè®°å½ãä½åªæå¨ readwrite
äºå¡ä¸æè½ä¿®æ¹å¯¹è±¡åå¨ãä½ éè¦ä½¿ç¨ IDBDatabase.transaction
å¯å¨ä¸ä¸ªäºå¡ãè¯¥æ¹æ³æ¥åä¸¤ä¸ªåæ°ï¼storeNames
ï¼ä½ç¨åï¼ä¸ä¸ªä½ æ³è®¿é®ç对象åå¨çæ°ç»ï¼ãäºå¡æ¨¡å¼ mode
ï¼readonly
æ readwrite
ï¼ãè¯¥æ¹æ³è¿åä¸ä¸ªå
å« IDBIndex.objectStore
æ¹æ³ï¼ä½ å¯ä»¥ä½¿ç¨å®æ¥è®¿é®å¯¹è±¡åå¨ï¼çäºå¡å¯¹è±¡ãæªæå® mode
æ¶ï¼äºå¡é»è®¤ä¸º readonly
模å¼ã
夿³¨ï¼ ä» Firfox 40 èµ·ï¼IndexedDB äºå¡æ¾æ¾äºå¯¹æä¹
æ§çä¿è¯ä»¥æé«æ§è½ï¼åè§ Webkit bug 1112702ï¼ã以åå¨ readwrite
äºå¡ä¸ï¼åªæå½ææçæ°æ®ç¡®ä¿è¢«åå
¥ç£çæ¶æä¼è§¦å complete
äºä»¶ãå¨ Firefox 40+ ä¸ï¼å½æä½ç³»ç»è¢«åç¥å»åå
¥æ°æ®å complete
äºä»¶ä¾¿è¢«è§¦åï¼ä½æ¤æ¶æ°æ®å¯è½è¿æ²¡æçæ£çåå
¥ç£çãcomplete
äºä»¶è§¦åå æ¤å徿´å¿«ï¼ä½è¿æ ·ä¼ææå°çæºä¼åç以䏿
åµï¼å¦ææä½ç³»ç»å´©æºæå¨æ°æ®è¢«åå
¥ç£çåæçµï¼é£ä¹æ´ä¸ªäºå¡é½å°ä¸¢å¤±ãç±äºè¿ç§ç¾é¾äºä»¶æ¯ç½è§çï¼å¤§å¤æ°ä½¿ç¨è
å¹¶ä¸éè¦è¿åæ
å¿ã妿ç±äºæäºåå ä½ å¿
é¡»ç¡®ä¿æ°æ®çæä¹
æ§ï¼ä¾å¦ä½ è¦ä¿åä¸ä¸ªæ æ³å次计ç®çå
³é®æ°æ®ï¼ï¼ä½ å¯ä»¥ä½¿ç¨å®éªæ§ï¼éæ åï¼ç readwriteflush
æ¨¡å¼æ¥å建äºå¡ä»¥å¼ºå¶ complete
äºä»¶å¨æ°æ®åå
¥ç£çå触åï¼åè§ IDBDatabase.transaction
ï¼ã
ä½ å¯ä»¥éè¿ä½¿ç¨åéçä½ç¨å忍¡å¼æ¥å éæ°æ®åºè®¿é®ï¼è¿æä¸¤ä¸ªæç¤ºï¼
readwrite
äºå¡ãä½ å¯ä»¥åæ¶æ§è¡å¤ä¸ª readonly
äºå¡ï¼åªæå®ä»¬çä½ç¨åæéå ï¼ä½å¯¹äºå¨ä¸ä¸ªå¯¹è±¡åå¨ä¸ä½ åªè½è¿è¡ä¸ä¸ª readwrite
äºå¡ãåè§ IndexedDB çå
³é®ç¹æ§ååºæ¬æ¯è¯ä¸äºå¡çå®ä¹ï¼ä»¥äºè§£æ´å¤ä¿¡æ¯ãå¦æä½ ååå建äºä¸ä¸ªæ°æ®åºï¼ä½ å¯è½æ³å¾éé¢åå ¥ä¸ç¹æ°æ®ãçèµ·æ¥ä¼åä¸é¢è¿æ ·ï¼
const transaction = db.transaction(["customers"], "readwrite");
// 注æï¼æ§çå®éªæ§æ¥å£å®ç°ä½¿ç¨äºå·²å¼ç¨ç常é IDBTransaction.READ_WRITE è䏿¯ "readwrite"ã
// å¦æä½ æ³æ¯æè¿æ ·çå®ç°ï¼ä½ å¯ä»¥è¿æ ·åï¼
// const transaction = db.transaction(["customers"], IDBTransaction.READ_WRITE);
transaction()
æ¹æ³æ¥åä¸¤ä¸ªåæ°ï¼ä¸ä¸ªæ¯å¯éçï¼å¹¶è¿åä¸ä¸ªäºå¡å¯¹è±¡ã第ä¸ä¸ªåæ°æ¯äºå¡å¸æè·¨è¶ç对象åå¨ç©ºé´çå表ãå¦æä½ å¸æäºå¡è½å¤è·¨è¶ææç对象åå¨ç©ºé´ï¼å¯ä»¥ä¼ å
¥ä¸ä¸ªç©ºæ°ç»ï¼ä½è¯·ä¸è¦è¿æ ·åï¼å 为è§èè§å®ä¼ å
¥ä¸ä¸ªç©ºæ°ç»ä¼å¯¼è´ InvalidAccessErrorãå¦ææ²¡æä¸ºç¬¬äºä¸ªåæ°æå®ä»»ä½å
容ï¼å¾å°çæ¯åªè¯»äºå¡ãå¦æä½ æ³åå
¥æ°æ®ï¼ä½ éè¦ä¼ å
¥ "readwrite"
æ å¿ã
ç°å¨æä»¬å·²ç»æäºä¸ä¸ªäºå¡ï¼æä»¬éè¦çè§£å®ççå½å¨æãäºå¡åäºä»¶å¾ªç¯çèç³»é常å¯åãå¦æä½ å建äºä¸ä¸ªäºå¡ï¼ä½æ¯å¹¶æªä½¿ç¨å®èè¿åç»äºä»¶å¾ªç¯ï¼é£ä¹äºå¡å°åä¸ºéæ´»è·ç¶æãä¿æäºå¡æ´»è·çå¯ä¸æ¹æ³å°±æ¯å¨å
¶ä¸ååºè¯·æ±ãå½è¯·æ±å®ææ¶ä½ å°ä¼å¾å°ä¸ä¸ª DOM äºä»¶ï¼å¹¶ä¸ï¼åè®¾è¯·æ±æåäºï¼ä½ å°ä¼æå¦å¤ä¸ä¸ªå¨åè°ä¸å»¶é¿è¿ä¸ªäºå¡çæºä¼ãå¦æä½ æ²¡æå»¶é¿äºå¡å°±è¿åå°äºäºä»¶å¾ªç¯ï¼é£ä¹äºå¡å°ä¼åå¾ä¸æ´»è·ï¼ä¾æ¤ç±»æ¨ãåªè¦è¿æå¾
å¤çç请æ±äºå¡å°±ä¼ä¿ææ´»è·ãäºå¡çå½å¨æççå¾ç®åï¼ä½æ¯å¯è½éè¦ä¸ç¹æ¶é´ä½ æè½ä¹ æ¯å®ãå举å 个示ä¾ä¹ä¼ææå¸®å©ãå¦æä½ å¼å§çå° TRANSACTION_INACTIVE_ERR
é误代ç ï¼é£ä¹ä½ å·²ç»ææäºäºæ
æä¹±äºã
äºå¡æ¥æ¶ä¸ç§ä¸åç±»åç DOM äºä»¶ï¼error
ãabort
å complete
ãæä»¬å·²ç»æå error
äºä»¶æ¯å泡æºå¶ï¼æä»¥äºå¡ä¼æ¥æ¶ç±å®äº§ççææè¯·æ±æäº§ççéè¯¯ãæ´å¾®å¦çä¸ç¹ï¼é误ä¼ä¸æå®æå¤çäºå¡ãé¤éä½ å¨é误åççç¬¬ä¸æ¶é´å°±è°ç¨äº stopPropagation()
å¹¶æ§è¡äºå
¶ä»æä½æ¥å¤çé误ï¼ä¸ç¶æ´ä¸ªäºå¡å°ä¼åæ»ãè¿ç§æºå¶è¿«ä½¿ä½ èèåå¤çé误ï¼å¦æè§å¾ç»è´çé误å¤ç太ç¹çï¼ä½ å¯ä»¥å¨æ°æ®åºä¸æ·»å ä¸ä¸ªæè·ææé误çé误å¤çå¨ãå¦æä½ å¨äºå¡ä¸æ²¡æå¤çä¸ä¸ªå·²åççé误äºä»¶æè
è°ç¨äº abort()
æ¹æ³ï¼é£ä¹è¯¥äºå¡ä¼è¢«åæ»ï¼å¹¶è§¦å abort
äºä»¶ãå¦å¤ï¼å¨ææè¯·æ±å®æåï¼äºå¡ç complete
äºä»¶ä¼è¢«è§¦åãå¦æä½ è¿è¡å¤§éæ°æ®åºæä½ï¼è·è¸ªäºå¡è䏿¯å
·ä½ç请æ±ä¼ä½¿é»è¾æ´å æ¸
æ°ã
ç°å¨ä½ æ¥æäºä¸ä¸ªäºå¡ï¼ä½ éè¦ä»ä¸è·åä¸ä¸ªå¯¹è±¡åå¨ãä½ åªè½å¨å建äºå¡æ¶æå®ç对象åå¨ä¸è·åãç¶åä½ å¯ä»¥æ·»å ä»»ä½ä½ éè¦çæ°æ®ã
// å¨æææ°æ®æ·»å 宿¯åçå¤ç
transaction.oncomplete = (event) => {
console.log("å
¨é¨å®æäºï¼");
};
transaction.onerror = (event) => {
// ä¸è¦å¿è®°é误å¤çï¼
};
const objectStore = transaction.objectStore("customers");
customerData.forEach((customer) => {
const request = objectStore.add(customer);
request.onsuccess = (event) => {
// event.target.result === customer.ssn;
};
});
è°ç¨ add()
æ¹æ³äº§çç请æ±ç result
æ¯è¢«æ·»å çæ°æ®çé®ãæä»¥å¨è¯¥ä¾ä¸ï¼å®åºè¯¥ä¸è¢«æ·»å 对象ç ssn
屿§ç¸çï¼å 为对象åå¨ä½¿ç¨ ssn
屿§ä½ä¸ºé®è·¯å¾ã注æï¼add()
彿°è¦æ±æ°æ®åºä¸ä¸è½åå¨ç¸åé®ç对象ãå¦æä½ æ³ä¿®æ¹ä¸ä¸ªå·²åå¨çè®°å½ï¼æè
ä½ ä¸å
³å¿è¯¥æ°æ®æ¯å¦å·²åå¨ï¼ä½ å¯ä»¥ä½¿ç¨ put()
æ¹æ³ï¼å°±åä¸é¢æ´æ°æ°æ®åºä¸çè®°å½é¨åæå±ç¤ºçã
å 餿°æ®æ¯é常类似çï¼
const request = db
.transaction(["customers"], "readwrite")
.objectStore("customers")
.delete("444-44-4444");
request.onsuccess = (event) => {
// å 餿åï¼
};
仿°æ®åºä¸è·åæ°æ®
ç°å¨æ°æ®åºéå·²ç»æäºä¸äºä¿¡æ¯ï¼ä½ å¯ä»¥éè¿å ç§æ¹æ³å¯¹å®è¿è¡æ¥è¯¢ãé¦å
æ¯ç®åç get()
ãä½ éè¦æä¾é®æ¥æ¥è¯¢å¼ï¼åè¿æ ·ï¼
const transaction = db.transaction(["customers"]);
const objectStore = transaction.objectStore("customers");
const request = objectStore.get("444-44-4444");
request.onerror = (event) => {
// é误å¤çï¼
};
request.onsuccess = (event) => {
// 对 request.result åäºæä½ï¼
console.log(`SSN 444-44-4444 对åºçå忝 ${request.result.name}`);
};
对äºä¸ä¸ªâç®åâçæ¥è¯¢ï¼è¿éçä»£ç æç¹å¤äºãä¸é¢çæä»¬æä¹æå®å缩çä¸ç¹ï¼åè®¾ä½ å¨æ°æ®åºç级å«ä¸è¿è¡é误å¤çï¼
db
.transaction("customers")
.objectStore("customers")
.get("444-44-4444").onsuccess = (event) => {
console.log(`SSN 444-44-4444 对åºçå忝 ${event.target.result.name}`);
};
ççè¿æ¯æä¹åå°çãå 为è¿éåªç¨å°ä¸ä¸ªå¯¹è±¡åå¨ï¼ä½ å¯ä»¥åªä¼ 该对象åå¨çååä½ä¸ºåæ°ï¼èä¸å¿
ä¼ ä¸ä¸ªå表ãå¹¶ä¸ï¼ä½ åªéè¯»åæ°æ®ï¼æä»¥ä¸éè¦ "readwrite"
äºå¡ã䏿å®äºå¡æ¨¡å¼æ¥è°ç¨ transaction()
ä½ ä¼å¾å°ä¸ä¸ª "readonly"
äºå¡ãå¦å¤ä¸ä¸ªå¾®å¦çå°æ¹å¨äºä½ 并没æä¿å请æ±å¯¹è±¡å°åéä¸ãå 为 DOM äºä»¶æè¯·æ±ä½ä¸ºå®çç®æ ï¼targetï¼ï¼ä½ å¯ä»¥ä½¿ç¨è¯¥äºä»¶æ¥è·å result
屿§ã
ç°å¨æä»¬å·²ç»æ¥è¯¢äºä¸äºæ°æ®ï¼ä¿®æ¹ä¸ä¸å¹¶æå®æåæ°æ®åºçæä½é常ç®åã让æä»¬æ¥ç¨å¾®æ´æ°ä¸ä¸ä¸ä¾ä¸çæ°æ®ï¼
const objectStore = db
.transaction(["customers"], "readwrite")
.objectStore("customers");
const request = objectStore.get("444-44-4444");
request.onerror = (event) => {
// é误å¤çï¼
};
request.onsuccess = (event) => {
// è·åæä»¬æ³è¦æ´æ°çæ§å¼
const data = event.target.result;
// æ´æ°å¯¹è±¡ä¸ä½ æ³ä¿®æ¹çå¼
data.age = 42;
// ææ´æ°è¿ç对象æ¾åæ°æ®åºã
const requestUpdate = objectStore.put(data);
requestUpdate.onerror = (event) => {
// 对é误è¿è¡å¤ç
};
requestUpdate.onsuccess = (event) => {
// æåï¼æ°æ®å·²æ´æ°ï¼
};
};
æä»¥è¿éæä»¬å建äºä¸ä¸ª objectStore
ï¼å¹¶éè¿æå® ssn å¼ï¼444-44-4444
ï¼ä»ä¸è¯·æ±äºä¸æ¡å®¢æ·è®°å½ãç¶åæä»¬æè¯·æ±çç»æä¿åå¨åéï¼data
ï¼ä¸ï¼å¹¶æ´æ°äºè¯¥å¯¹è±¡ç age
屿§ï¼ä¹åå建äºç¬¬äºä¸ªè¯·æ±ï¼requestUpdate
ï¼å°å®¢æ·æ°æ®æ¾å objectStore
æ¥è¦çä¹åçå¼ã
夿³¨ï¼ å¨è¿ä¸ªä¾å䏿们å¿
é¡»æå® readwrite
äºå¡ï¼å 为æä»¬æ³è¦åå
¥æ°æ®åºï¼èä¸ä»
ä»
æ¯ä»ä¸è¯»åã
ä½¿ç¨ get()
è¦æ±ä½ ç¥éä½ æ³è¦æ£ç´¢åªä¸ä¸ªé®ãå¦æä½ æ³è¦éå对象åå¨ç©ºé´ä¸çææå¼ï¼é£ä¹ä½ å¯ä»¥ä½¿ç¨æ¸¸æ ãçèµ·æ¥ä¼åä¸é¢è¿æ ·ï¼
const objectStore = db.transaction("customers").objectStore("customers");
objectStore.openCursor().onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
console.log(`SSN ${cursor.key} 对åºçå忝 ${cursor.value.name}`);
cursor.continue();
} else {
console.log("æ²¡ææ´å¤è®°å½äºï¼");
}
};
openCursor()
彿°æ¥åå ä¸ªåæ°ãé¦å
ï¼ä½ å¯ä»¥ä½¿ç¨æä»¬å°å¨ç¨åä»ç»ç key range 对象æ¥éå¶è¢«æ£ç´¢ç项ç®çèå´ã第äºï¼ä½ å¯ä»¥æå®ä½ 叿è¿è¡è¿ä»£çæ¹åãå¨ä¸é¢ç示ä¾ä¸ï¼æä»¬ä»¥ååºè¿ä»£ææçå¯¹è±¡ãæ¸¸æ çæååè°æç¹ç¹å«ã游æ 对象æ¬èº«æ¯è¯·æ±ç result
ï¼ä¸é¢æä»¬ä½¿ç¨çæ¯ç®åå½¢å¼ï¼æä»¥æ¯ event.target.result
ï¼ãç¶åï¼å¯ä»¥å¨æ¸¸æ 对象ç key
å value
屿§ä¸æ¾å°å®é
çé®åå¼ãå¦æä½ æ³è¦ç»§ç»ï¼é£ä¹ä½ å¿
é¡»è°ç¨æ¸¸æ ä¸ç continue()
ãå½ä½ å·²ç»å°è¾¾æ°æ®çæ«å°¾æ¶ï¼æè
没æå¹é
openCursor()
请æ±çæ¡ç®ï¼ä½ ä»ç¶ä¼å¾å°ä¸ä¸ªæååè°ï¼ä½æ¯ result
屿§æ¯ undefined
ã
ä½¿ç¨æ¸¸æ çä¸ç§å¸¸è§æ¨¡å¼æ¯æ¥è¯¢ä¸ä¸ªå¯¹è±¡åå¨ä¸çææå¯¹è±¡ï¼ç¶åæå®ä»¬æ·»å å°ä¸ä¸ªæ°ç»ä¸ï¼åè¿æ ·ï¼
const customers = [];
objectStore.openCursor().onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
customers.push(cursor.value);
cursor.continue();
} else {
console.log(`å·²è·åçææå®¢æ·ï¼${customers}`);
}
};
夿³¨ï¼ æè
ï¼ä½ å¯ä»¥ä½¿ç¨ getAll()
ï¼æ getAllKeys()
ï¼æ¥å¤çè¿ç§æ
åµãä¸é¢ç代ç çææåä¸ä¾ç¸åï¼
objectStore.getAll().onsuccess = (event) => {
console.log(`å·²è·åçææå®¢æ·ï¼${event.target.result}`);
};
æ¥è¯¢æ¸¸æ ç value
屿§ä¼å¸¦æ¥æ§è½æ¶èï¼å 为对象æ¯å»¶è¿å建çãå¦æä½ ä½¿ç¨ getAll()
ï¼æµè§å¨å¿
须䏿¬¡å建ææç对象ãå¦æä½ åªæ³æ£ç´¢é®ï¼é£ä¹ä½¿ç¨æ¸¸æ å°æ¯ä½¿ç¨ getAll()
髿å¾å¤ãå½ç¶å¦æä½ æ³è·åä¸ä¸ªç±å¯¹è±¡åå¨ä¸ææå¯¹è±¡ç»æçæ°ç»ï¼è¯·ä½¿ç¨ getAll()
ã
ä½¿ç¨ SSN ä½ä¸ºé®æ¥åå¨å®¢æ·æ°æ®æ¯åççï¼å 为 SSN å¯ä¸å°æ è¯äºä¸ä¸ªä¸ªä½ï¼å¯¹éç§æ¥è¯´è¿æ¯å¦æ¯ä¸ä¸ªå¥½çæ³æ³æ¯å¦å¤ä¸ä¸ªè¯é¢ï¼ä¸å¨æ¬æç讨论èå´å ï¼ãå¦æä½ æ³è¦éè¿å§åæ¥æ¥æ¾ä¸ä¸ªå®¢æ·ï¼é£ä¹ï¼ä½ å°éè¦å¨æ°æ®åºä¸è¿ä»£ææç SSN ç´å°ä½ æ¾å°æ£ç¡®çé£ä¸ªã以è¿ç§æ¹å¼æ¥æ¥æ¾å°ä¼éå¸¸çæ ¢ï¼ç¸åä½ å¯ä»¥ä½¿ç¨ç´¢å¼ã
// é¦å
ï¼ç¡®å®ä½ å·²ç»å¨ request.onupgradeneeded ä¸å建äºç´¢å¼ï¼
// objectStore.createIndex("name", "name");
// å¦åä½ å°å¾å° DOMExceptionã
const index = objectStore.index("name");
index.get("Donna").onsuccess = (event) => {
console.log(`Donna ç SSN æ¯ ${event.target.result.ssn}`);
};
ânameâ屿§ä¸æ¯å¯ä¸çï¼å æ¤ name
被设æ "Donna"
çè®°å½å¯è½ä¸æ¢ä¸æ¡ãå¨è¿ç§æ
åµä¸ï¼ä½ æ»æ¯å¾å°é®å¼æå°çé£ä¸ªã
妿éè¦è®¿é®å¸¦æç»å® name
çææçè®°å½ï¼å¯ä»¥ä½¿ç¨æ¸¸æ ãä½ å¯ä»¥å¨ç´¢å¼ä¸æå¼ä¸¤ç§ä¸åç±»åçæ¸¸æ ï¼å¸¸è§æ¸¸æ å¯ä»¥æ å°ç´¢å¼å±æ§å°å¯¹è±¡åå¨ç©ºé´ä¸ç对象ï¼é®æ¸¸æ å¯ä»¥æ å°ç´¢å¼å±æ§å°ç¨æ¥åå¨å¯¹è±¡åå¨ç©ºé´ä¸ç对象çé®ãå·®å¼å¦ä¸æç¤ºï¼
// 使ç¨å¸¸è§æ¸¸æ æ¥è·åææå®¢æ·è®°å½ç对象
index.openCursor().onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
// cursor.key æ¯ååï¼å¦âBillâï¼è cursor.value æ¯æ´ä¸ªå¯¹è±¡ã
console.log(
`ååï¼${cursor.key}ï¼SSNï¼${cursor.value.ssn}ï¼çµåé®ä»¶ï¼${cursor.value.email}`,
);
cursor.continue();
}
};
// 使ç¨é®æ¸¸æ æ¥è·å客æ·è®°å½ç对象çé®
index.openKeyCursor().onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
// cursor.key æ¯ååï¼å¦âBillâï¼è cursor.value æ¯ SSNã
// æ æ³ç´æ¥è·ååå¨å¯¹è±¡çå
¶ä½é¨åã
console.log(`Name: ${cursor.key}, SSN: ${cursor.primaryKey}`);
cursor.continue();
}
};
æå®æ¸¸æ çèå´åæ¹å
å¦æä½ æ³è¦éå®ä½ 卿¸¸æ ä¸çå°çå¼çèå´ï¼ä½ å¯ä»¥ä½¿ç¨ IDBKeyRange
对象ï¼ç¶åæå®ä½ä¸ºç¬¬ä¸ä¸ªåæ°ä¼ ç» openCursor()
æ openKeyCursor()
ãä½ å¯ä»¥æé ä¸ä¸ªåªå
许å个é®çé®èå´ï¼æè
ä¸ä¸ªå
·æä¸éæä¸éçï¼æè
ä¸ä¸ªæ¢æä¸é乿ä¸éçãè¾¹çå¯ä»¥æ¯âéåçâï¼ä¹å°±æ¯è¯´é®èå´å
å«ç»å®çå¼ï¼æè
æ¯â弿¾çâï¼ä¹å°±æ¯è¯´é®èå´ä¸å
æ¬ç»å®çå¼ï¼ãå®çå·¥ä½åçå¦ä¸ï¼
// ä»
å¹é
âDonnaâ
const singleKeyRange = IDBKeyRange.only("Donna");
// å¹é
ææå¤§äºâBillâçï¼å
æ¬âBillâ
const lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill");
// å¹é
ææå¤§äºâBillâçï¼ä½ä¸å
æ¬âBillâ
const lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true);
// å¹é
ææå°äºâDonnaâçï¼ä¸å
æ¬âDonnaâ
const upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true);
// å¹é
ææå¨âBillâåâDonnaâä¹é´çï¼ä½ä¸å
æ¬âDonnaâ
const boundKeyRange = IDBKeyRange.bound("Bill", "Donna", false, true);
// 使ç¨å
¶ä¸çä¸ä¸ªé®èå´ï¼æå®ä½ä¸º openCursor()/openKeyCursor() ç第ä¸ä¸ªåæ°
index.openCursor(boundKeyRange).onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
// 对å¹é
ç»æè¿è¡ä¸äºæä½ã
cursor.continue();
}
};
ææ¶åä½ å¯è½æ³è¦ä»¥éåºè䏿¯ååºï¼æææ¸¸æ çé»è®¤é¡ºåºï¼æ¥è¿ä»£ã忢æ¹åæ¯éè¿ç» openCursor()
æ¹æ³ç第äºä¸ªåæ°ä¼ é prev
æ¥å®ç°çï¼
objectStore.openCursor(boundKeyRange, "prev").onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
// 对记å½è¿è¡ä¸äºæä½ã
cursor.continue();
}
};
å¦æä½ åªæ¯æ³æ¹åè¿ä»£çæ¹åï¼è䏿³å¯¹ç»æè¿è¡çéï¼ä½ åªéè¦ç»ç¬¬ä¸ä¸ªåæ°ä¼ å ¥ nullã
objectStore.openCursor(null, "prev").onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
// 对记å½è¿è¡ä¸äºæä½ã
cursor.continue();
}
};
å 为ânameâç´¢å¼ä¸æ¯å¯ä¸çï¼é£å°±æå¯è½åå¨å
·æç¸å name
ç夿¡è®°å½ãè¦æ³¨æçæ¯è¿ç§æ
åµä¸å¯è½åçå¨å¯¹è±¡åå¨ç©ºé´ä¸ï¼å 为é®å¿
é¡»æ°¸è¿æ¯å¯ä¸çãå¦æä½ æ³è¦å¨æ¸¸æ å¨ç´¢å¼è¿ä»£è¿ç¨ä¸è¿æ»¤åºéå¤çï¼ä½ å¯ä»¥ä¼ é nextunique
ï¼æ prevunique
ï¼å¦æä½ æ£å¨å忥æ¾ï¼ä½ä¸ºæ¹ååæ°ãå½ä½¿ç¨ nextunique
ææ¯ prevunique
æ¶ï¼è¢«è¿åçæ»æ¯é®æå°çè®°å½ã
index.openKeyCursor(null, "nextunique").onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
// 对记å½è¿è¡ä¸äºæä½ã
cursor.continue();
}
};
请åè§âIDBCursor 常éâï¼ä»¥è·åææçæ¹ååæ°ã
å½ä¸ä¸ª web åºç¨å¨å¦ä¸ä¸ªæ ç¾é¡µä¸è¢«æå¼æ¶ççæ¬åæ´å½ä½ ç web åºç¨ä»¥æ°æ®åºçæ¬åæ´çæ¹å¼åçæ¹åæ¶ï¼ä½ éè¦èèï¼å¦æç¨æ·å¨ä¸ä¸ªæ ç¾é¡µä¸æå¼çåºç¨é使ç¨äºæ§çæ¬çæ°æ®åºï¼å¨å¦ä¸ä¸ªæ ç¾é¡µéå è½½æ°çæ¬çæ°æ®åºæ¶ä¼åçä»ä¹ãå½ä½ ä½¿ç¨æ´é«ççæ¬å·è°ç¨ open()
æ¹æ³æ¶ï¼å
¶ä»æææå¼çæ°æ®åºå¿
é¡»æ¾å¼å°ç¡®è®¤è¯·æ±ï¼ä½ æè½å¯¹æ°æ®åºè¿è¡ä¿®æ¹ï¼onblocked
äºä»¶ä¼è¢«è§¦åï¼ç´å°å®ä»¬è¢«å
³éæéæ°å è½½ï¼ãå®çå·¥ä½åçå¦ä¸ï¼
const openReq = mozIndexedDB.open("MyTestDatabase", 2);
openReq.onblocked = (event) => {
// 妿å
¶ä»çä¸äºé¡µç¾å è½½äºè¯¥æ°æ®åºï¼å¨æä»¬ç»§ç»ä¹åéè¦å
³éå®ä»¬ã
console.log("请å
³éå
¶ä»æå¼äºè¯¥ç«ç¹çæ ç¾é¡µï¼");
};
openReq.onupgradeneeded = (event) => {
// å
¶ä»çæ°æ®åºå·²ç»è¢«å
³éï¼ä¸å就绪ã
db.createObjectStore(/* ⦠*/);
useDatabase(db);
};
openReq.onsuccess = (event) => {
const db = event.target.result;
useDatabase(db);
return;
};
function useDatabase(db) {
// è¯·ç¡®ä¿æ·»å äºå¨å
¶ä»æ ç¾é¡µè¯·æ±äºçæ¬åæ´æ¶ä¼è¢«éç¥çäºä»¶å¤çå¨ã
// æä»¬å¿
é¡»å
³éæ°æ®åºãè¿å
许å
¶ä»æ ç¾é¡µæ´æ°æ°æ®åºã
// 妿ä¸è¿æ ·åï¼å¨ç¨æ·å
³éè¿äºæ ç¾é¡µä¹åï¼çæ¬å级å°ä¸ä¼åçã
db.onversionchange = (event) => {
db.close();
console.log("æ¤é¡µé¢çæ°çæ¬å·²åå¤å°±ç»ªãè¯·éæ°å è½½æå
³éæ¤æ ç¾é¡µï¼");
};
// å¤çæ°æ®åºã
}
ä½ åæ¶ä¹åºçå¬ VersionError
é误æ¥å¤ç以ä¸åºæ¯ï¼å·²ç»æå¼çåºç¨çåå§å代ç å°è¯æå¼è¿æ¶çæ¬çæ°æ®åºã
IndexedDB 使ç¨åæºååï¼è¿æå³ç宿åå¨ç»å®å°äºå建å®çç«ç¹çæºï¼å ¸åæ åµä¸ï¼å°±æ¯ç«ç¹çåææ¯ååï¼ï¼æä»¥å®ä¸è½è¢«ä»»ä½å ¶ä»æ¥æºè®¿é®ã
ç¬¬ä¸æ¹çªå£å
å®¹ï¼æ¯å¦ <iframe>
å
容ï¼å¯ä»¥è®¿é®å®æåµå
¥çæºç IndexedDB ä»åºï¼é¤éæµè§å¨è¢«è®¾ç½®æä»ä¸æ¥åç¬¬ä¸æ¹ cookieï¼åè§ Firefox bug 1147821ï¼ã
彿µè§å¨å ³éï¼ç±äºç¨æ·éæ©å ³éæéåºé项ï¼ï¼å 嫿°æ®åºçç£ç被æå¤ç§»é¤ï¼æè æ°æ®åºåå¨çæé丢失ï¼å°åç以ä¸é®é¢ï¼
AbortError
éè¯¯ä¸æã该影åå卿¯ä¸ªäºå¡ä¸è°ç¨ IDBTransaction.abort()
ç¸åãIDBDatabase
对象æ¶å°ä¸ä¸ª close
äºä»¶ãä½ å¯ä»¥ä½¿ç¨ IDBDatabase.onclose
äºä»¶å¤ç卿¥çå¬è¿äºäºä»¶ï¼è¿æ ·ä½ å°±å¯ä»¥ç¥éä»ä¹æ¶åæ°æ®åºè¢«æå¤å
³éäºãä¸è¿°çè¡ä¸ºåªå¨ Firefox 50ãGoogle Chrome 31ï¼å¤§çº¦ï¼åè¡çæ¬ä¸æ¯æã
å¨è¿äºçæ¬ä¹åçæµè§å¨ï¼äºå¡ä¼éé»ä¸æï¼å¹¶ä¸ä¸ä¼è§¦å close
äºä»¶ï¼è¿æ ·å°±æ æ³å¯è§æ°æ®åºçå¼å¸¸å
³éã
ç±äºç¨æ·å¯ä»¥å¨ä»»ä½æ¶åå ³éæµè§å¨ï¼å æ¤ä½ ä¸è½ä¾èµäºä»»ä½ç¹å®äºå¡ç宿ãå¹¶ä¸å¨èçæ¬çæµè§å¨ï¼ä½ çè³é½æ æ³æç¥å®ä»¬æ¯å¦é¡ºå©å®æãé对è¿ç§è¡ä¸ºè¿éæä¸äºå¯ç¤ºï¼
é¦å ï¼ä½ åºè¯¥å§ç»ä½¿æ°æ®åºå¨äºå¡ç»ææ¶å¤äºä¸ä¸ªç¨³å®çç¶æãæ¯å¦ï¼åè®¾ä½ ä½¿ç¨äºä¸ä¸ªæ°æ®åºæ¥ä¿åä¸ä¸ªå è®¸ç¨æ·ç¼è¾ç项ç®å表ï¼ä½ éè¿æ¸ 空对象åå¨ç¶ååå ¥æ°å表æ¥å¨ç¨æ·ç¼è¾åä¿åå®ï¼è¿åå¨ä¸ä¸ªé£é©ï¼é£å°±æ¯æµè§å¨å¯è½å¨æ¸ ç©ºæ°æ®åè¿æ²¡æåå ¥æ°æ®æ¶å°±å ³éäºï¼ä½¿å¾å¯¹è±¡åå¨åå¾ç©ºç©ºå¦ä¹ã为äºé¿å è¿ç§æ åµï¼ä½ åºè¯¥å¨åä¸ä¸ªäºå¡ä¸æ§è¡æ¸ ç©ºæ°æ®ååå ¥æ°æ®çæä½ã
å ¶æ¬¡ï¼ä½ ä¸åºè¯¥ææ°æ®åºäºå¡ç»å®å°å¸è½½äºä»¶ä¸ã妿å¸è½½äºä»¶è¢«æµè§å¨å ³éæè§¦åï¼å¸è½½äºä»¶å¤çå¨ä¸çä»»ä½äºå¡é½ä¸ä¼å®æãè·¨æµè§å¨ä¼è¯ç»´æ¤ä¿¡æ¯çç´è§çå®ç°æ¹æ³æ¯å¨æµè§å¨ï¼æç¹å®é¡µï¼æå¼æ¶ä»æ°æ®åºè¯»åå®ï¼å¨ç¨æ·åæµè§å¨äº¤äºæ¶æ´æ°å®ï¼ç¶å卿µè§å¨ï¼æé¡µé¢ï¼å ³éæ¶ä¿åè³æ°æ®åºãç¶èï¼è¿å¹¶ä¸ä¼çæãè¿æ ·ä¸æ¥ï¼æ°æ®åºäºå¡ä¼å¨å¸è½½äºä»¶å¤çå¨ä¸è¢«å建ï¼ä½ç±äºå®ä»¬æ¯å¼æ¥çï¼æä»¥å¨æ§è¡ä¹åå°±ä¼è¢«ä¸æã
å®é
ä¸ï¼è¿é没æåæ³å¯ä»¥ç¡®ä¿ IndexedDB äºå¡å¯ä»¥æ§è¡å®æ¯ï¼å³ä½¿æ¯æµè§å¨æ£å¸¸å
³éçæ
åµãåè§ Firefox bug 870645ãä½ä¸ºä¸ä¸ªæ£å¸¸å
³ééç¥çåéæ¹æ¡ï¼å¦ææ¤æ¶æäºå¡å¨æ°æ®åºå¸è½½æ¶è¿æ²¡æå®æï¼ä½ å¯ä»¥è·è¸ªä½ çäºå¡å¹¶æ·»å ä¸ä¸ª beforeunload
äºä»¶æ¥æéç¨æ·ã
è³å°éè¿æ·»å 䏿æéå IDBDatabase.onclose
ï¼ä½ å¯ä»¥å¾ç¥å®ä½æ¶å
³éäºã
Mozilla å·²ç»å¨ Firefox 43+ ä¸å®ç°äºå¯¹ IndexedDB æ°æ®è¿è¡æ¬å°åæåºçè½åãé»è®¤æ åµä¸ï¼IndexedDB æ ¹æ¬ä¸ä¼å¤çå½é åçå符串æåºï¼ææçæ°æ®æç §è±æåæ¯åºæåãä¾å¦ï¼bãáãzãa ä¼è¢«æåºä¸ºï¼
è¿æ¾ç¶ä¸æ¯ç¨æ·æ³è¦çæ°æ®æåºæ¹å¼ï¼ä¾å¦ Aaron å Ãaron å¨é讯å½ä¸çåºç¸é»å°æåã妿è¦è·åå½é åçæåºï¼éè¦å°æ´ä¸ªæ°æ®å 容è°å ¥å åï¼ç¶åç±å®¢æ·ç«¯ JavaScript å®ç°æåºï¼æ¾ç¶è¿æ ·å䏿¯å¾é«æã
è¿æ¯ä¸ä¸ªæ°çåè½ï¼å®å
许å¼åè
å¨ä½¿ç¨ IDBObjectStore.createIndex()
ï¼æ¥çå®çåæ°ï¼åå»ºç´¢å¼æ¶æå®åºåãå¨è¿ç§æ
åµä¸ï¼ä¸ä¸ªæ¸¸æ ä¼è¢«ç¨äºè¿ä»£æ°æ®éï¼å¦æä½ æ³æå®æ¬å°åçæåºï¼ä½ å¯ä»¥ä½¿ç¨ä¸é¨ç IDBLocaleAwareKeyRange
ã
IDBIndex
è¿æ·»å äºæ°ç屿§æ¥æç¤ºå®å·²ç»è¢«æå®äºåºå设置ï¼locale
ï¼è¿å被æå®çåºåæ nullï¼å isAutoLocale
ï¼å¦æåå»ºç´¢å¼æ¶ä½¿ç¨äºèªå¨çåºåï¼å³ä½¿ç¨äºå¹³å°é»è®¤çåºåï¼åè¿å true
ï¼å¦åè¿å false
ï¼ã
夿³¨ï¼ ç°å¨è¯¥ç¹æ§è¢«æ å¿æéèââè¯·å¨ about:config
ä¸å¼å¯ dom.indexedDB.experimental
æ¥å¯ç¨å®å¹¶æµè¯è¯¥ç¹æ§ã
æä»¬æä¸ä¸ªä½¿ç¨ IndexedDB API ç宿´ç¤ºä¾ã该示ä¾ä½¿ç¨ IndexedDB æ¥åå¨åæ£ç´¢åºçç©ã
åè§å¦æéè¦ï¼è¯·è¿ä¸æ¥é 读以è·åæ´å¤ä¿¡æ¯ã
åè æç¨åæå 彿°åºRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4