InexedDB ã¯çµã¿è¾¼ã¿ã®ãã¼ã¿ãã¼ã¹ã§ãlocalStorage ãããé¥ãã«å¼·åã§ãã
- key/value ã¹ãã¬ã¼ã¸: å¤ã¯ä½ã§ããããè¤æ°ã®ãã¼ã®åãããã¾ãã
- ä¿¡é ¼æ§ã®ããã®ãã©ã³ã¶ã¯ã·ã§ã³ããµãã¼ããã¾ãã
- ãã¼ç¯å²ã®ã¯ã¨ãªãã¤ã³ããã¯ã¹ããµãã¼ããã¾ãã
localStorageããããã£ã¨å¤ãã®ãã¼ã¿ãæ ¼ç´ãããã¨ãã§ãã¾ãã
é常ããã®æ©è½ã¯ä¼çµ±çãªã¯ã©ã¤ã¢ã³ã-ãµã¼ãã¢ããªã±ã¼ã·ã§ã³ã«ã¯é大ã§ããIndexedDB ã¯ãServiceWorkers ãä»ã®ãã¯ããã¸ã¼ã¨çµã¿åããããªãã©ã¤ã³ã¢ããªã±ã¼ã·ã§ã³ãæ³å®ãã¦ãã¾ãã
仿§ ã«è¨è¼ããã¦ãã IndexedDB ã®ãã¤ãã£ãã¤ã³ã¿ã¼ãã§ã¼ã¹ã¯ãã¤ãã³ããã¼ã¹ã§ãã
idb ã®ããã«ãpromise ãã¼ã¹ã®ã©ããã¼ã使ã£ã¦ async/await ã使ããã¨ãã§ãã¾ããããã¯é常ã«ä¾¿å©ã§ãããã©ããã¼ã¯å®ç§ã§ã¯ããã¾ããããã¹ã¦ã®ã±ã¼ã¹ã®ã¤ãã³ããç½®ãæãããã¨ã¯ã§ããªãã®ã§ãã¤ãã³ãããå§ãã¦ããã®å¾ã©ããã¼ã使ç¨ãã¾ãããã
ãã¼ã¿ãã¼ã¹ãéã
IndexedDB ã使ãå§ããã«ã¯ããã¼ã¿ãã¼ã¹ã open ãã¾ãã
æ§æ:
let openRequest = indexedDB.open(name, version);
nameâ æååããã¼ã¿ãã¼ã¹ã®ååã§ããversionâ æ£ã®æ´æ°ã§è¡¨ç¾ããããã¼ã¸ã§ã³ãããã©ã«ãã¯1(å¾è¿°).
ç§ãã¡ã¯ãç°ãªãååã§å¤ãã®ãã¼ã¿ãã¼ã¹ãæã¤ãã¨ãã§ãããããã¯ãã¹ã¦ç¾å¨ã®ãªãªã¸ã³ (domain/protocol/port) ã®ä¸ã«ããã¾ãããã®ãããå¥ã®Webãµã¤ãã¯äºãã®ãã¼ã¿ãã¼ã¹ã«ã¢ã¯ã»ã¹ãããã¨ã¯ã§ãã¾ããã
å¼ã³åºãå¾ãopenRequest ãªãã¸ã§ã¯ãã®ã¤ãã³ãããªãã¹ã³ããå¿
è¦ãããã¾ãã:
success: ãã¼ã¿ãã¼ã¹ã®æºåãã§ãã¾ããã以éã®å¦çã§ã¯ãã¼ã¿ãã¼ã¹ãªãã¸ã§ã¯ãopenRequest.resultã使ãã¾ããerror: éãã®ã«å¤±æãã¾ãããupgradeneeded: ãã¼ã¿ãã¼ã¹ã®ãã¼ã¸ã§ã³ãå¤ããªã£ã¦ãã¾ã(ä¸ãè¦ã¦ãã ãã)ã
IndexedDB ã«ã¯ããµã¼ããµã¤ãã®ãã¼ã¿ãã¼ã¹ã«ã¯ãªããçµã¿è¾¼ã¿ã® âã¹ãã¼ããã¼ã¸ã§ãã³ã°â ã®ä»çµã¿ãããã¾ãã
ãµã¼ããµã¤ãã®ãã¼ã¿ãã¼ã¹ã¨ã¯ç°ãªããIndexedDB ã¯ã¯ã©ã¤ã¢ã³ããµã¤ãã§ãããã¼ã¿ã¯æå ã«ã¯ããã¾ãããããããæ°ããã¢ããªãå ¬éããã¨ãããã¼ã¿ãã¼ã¹ã®æ´æ°ãå¿ è¦ãªãã¨ãããã¾ãã
ãã¼ã«ã«ãã¼ã¿ãã¼ã¹ãã¼ã¸ã§ã³ã open ã§æå®ããããã®ããå°ããå ´åãç¹å¥ãªã¤ãã³ã upgradeneeded ãããªã¬ã¼ãããå¿
è¦ã«å¿ãã¦ãã¼ã¸ã§ã³ãæ¯è¼ãããã¼ã¿æ§é ãæ´æ°ããäºãã§ãã¾ãã
ãã®ã¤ãã³ãã¯ãã¼ã¿ãã¼ã¹ãã¾ã åå¨ããªãã£ãå ´åã«ãèµ·ããã®ã§ãåæåã®å®è¡ããããã¨ãã§ãã¾ãã
ä¾ãã°ãæåã«ã¢ããªãå
¬éããã¨ãã«ã¯ããã¼ã¸ã§ã³ 1 ã§ open ããupgradeneeded ãã³ãã©ã§åæåãå®è¡ãã¾ãã:
let openRequest = indexedDB.open("store", 1);
openRequest.onupgradeneeded = function() {
// ã¯ã©ã¤ã¢ã³ãããã¼ã¿ãã¼ã¹ãæã£ã¦ããªãå ´åã«ããªã¬ã¼ããã¾ã
// ...åæåãè¡ãã¾ã...
};
openRequest.onerror = function() {
console.error("Error", openResult.error);
};â
openRequest.onsuccess = function() {
let db = openRequest.result;
// db ãªãã¸ã§ã¯ãã仿§ãã¦ãã¼ã¿ãã¼ã¹ãæä½ãã¾ã
};
次ã®ãã¼ã¸ã§ã³ããªãªã¼ã¹ããæ:
let openRequest = indexedDB.open("store", 2);
// æ¢åã®ãã¼ã¿ãã¼ã¹ã®ãã¼ã¸ã§ã³ããã§ãã¯ããå¿
è¦ãªãæ´æ°ãã:
openRequest.onupgradeneeded = function() {
let db = openRequest.result;
switch(db.version) { // æ¢åã® (å¤ã) db ã®ãã¼ã¸ã§ã³
case 0:
// ãã¼ã¸ã§ã³ 0 ã¯ãã¯ã©ã¤ã¢ã³ãããã¼ã¿ãã¼ã¹ãæã£ã¦ããªããã¨ãæå³ãã¾ã
// åæåãè¡ãã¾ã
case 1:
// ã¯ã©ã¤ã¢ã³ãã¯ãã¼ã¸ã§ã³ 1
// ææ°çã«æ´æ°ãã¾ã
}
};
openRequest.onsuccess ã®å¾ããã¼ã¿ãã¼ã¹ãªãã¸ã§ã¯ã㯠openRequest.result ã«ããã¾ãã以éã®æä½ã§ããã使ã£ã¦ããã¾ãã
ãã¼ã¿ãã¼ã¹ãåé¤ããã«ã¯:
let deleteRequest = indexedDB.deleteDatabase(name)
// deleteRequest.onsuccess/onerror ã§çµæã追跡ãã¾ã
ãªãã¸ã§ã¯ãã¹ãã¢
ãªãã¸ã§ã¯ãã¹ãã¢ã¯ IndexedDB ã®ä¸å¿ã¨ãªãæ¦å¿µã§ããä»ã®ãã¼ã¿ãã¼ã¹ã§ã¯ âãã¼ãã«â ã âã³ã¬ã¯ã·ã§ã³â ã¨å¼ã°ãã¦ãããã®ã§ããããã¯ãã¼ã¿ãæ ¼ç´ãããå ´æã§ãããã¼ã¿ãã¼ã¹ã¯è¤æ°ã®ã¹ãã¢ãæã¤ãã¨ãããã¾ãã: 1ã¤ã¯ã¦ã¼ã¶ç¨ãããï¼ã¤ã¯ååç¨ããªã©ã§ãã
âãªãã¸ã§ã¯ãã¹ãã¢â ã¨ããååã§ã¯ããã¾ãããããªããã£ããæ ¼ç´ãããã¨ãå¯è½ã§ãã
è¤éãªãªãã¸ã§ã¯ãå«ããã»ã¼ã©ããªå¤ã§ãæ ¼ç´ãããã¨ãã§ãã¾ãã
IndexedDB 㯠standard serialization algorithm ã使ç¨ãã¦ãªãã¸ã§ã¯ããè¤è£½ãæ ¼ç´ãã¾ãããã㯠JSON.stringify ã«ä¼¼ã¦ãã¾ãããããå¼·åã§é¥ãã«å¤ãã®ãã¼ã¿ã¿ã¤ããæ ¼ç´ãããã¨ãã§ãã¾ãã
æ ¼ç´ã§ããªããªãã¸ã§ã¯ãã®ä¾ã¯ã循ç°åç
§ãæã¤ãªãã¸ã§ã¯ãã§ãããã®ãããªãªãã¸ã§ã¯ãã¯ã·ãªã¢ã©ã¤ãºå¯è½ã§ã¯ããã¾ãããJSON.stringify ã失æãã¾ãã
ã¹ãã¢å
ã®ãã¹ã¦ã®å¤ã«ã¯ä¸æã¨ãªã key ãå¿
è¦ã§ãã
ãã¼ã¯æ¬¡ã®ããããã®ã¿ã¤ãã§ãªããã°ãªãã¾ãã: number, date, string, binary, ã¾ã㯠arrayãããã¯ä¸æãªãªãã¸ã§ã¯ãèå¥åã§ããã¼ã使ã£ã¦å¤ã®æ¤ç´¢/åé¤/æ´æ°ããããã¨ãã§ãã¾ãã
localStorage ã¨åæ§ãã¹ãã¢ã«å¤ã追å ããã¨ãã«ãã¼ãæå®ã§ãã¾ããããã¯ããªããã£ãå¤ãæ ¼ç´ããã®ã«é©ãã¦ãã¾ãã ãããããªãã¸ã§ã¯ããæ ¼ç´ããã¨ããIndexedDB ã¯ãªãã¸ã§ã¯ãããããã£ããã¼ã¨ãã¦è¨å®ãããã¨ãå¯è½ã«ããããã¯ã¨ã¦ã便å©ã§ãããããã¯ããã¼ãèªåçæãããã¨ãã§ãã¾ãã
ãªãã¸ã§ã¯ãã¹ãã¢ã使ããæ§æ:
db.createObjectStore(name[, keyOptions]);
æä½ã¯åæã§ãããawait ã¯å¿
è¦ãªããã¨ã«çæãã¦ãã ããã
nameã¯ã¹ãã¢åã§ããe.g. æ¬ç¨ã«"books"ãªã©keyOptionsã¯2ã¤ã®ããããã£ã®ãã¡1ã¤ãæã¤ãªãã·ã§ã³ã®ãªãã¸ã§ã¯ãã§ããkeyPathâ IndexedDBããã¼ããã¦ä½¿ç¨ãããªãã¸ã§ã¯ãããããã£ã®ãã¹ã§ããe.g. `id.autoIncrementâtrueã®å ´åãæ°ããæ ¼ç´ããããªãã¸ã§ã¯ãã®ãã¼ã¯ãã¤ã³ã¯ãªã¡ã³ããããæ°å¤ã¨ãã¦ãèªåçã«çæããã¾ãã
ä½ããªãã·ã§ã³ãæå®ããªãå ´åã¯ããã¨ã§ãªãã¸ã§ã¯ããæ ¼ç´ããã¨ãã«æç¤ºçã«ãã¼ãæå®ããå¿ è¦ãããã¾ãã
ä¾ãã°ããã®ãªãã¸ã§ã¯ãã¹ãã¢ã¯ãã¼ã¨ã㦠id ããããã£ã使ç¨ãã¾ãã:
db.createObjectStore('books', {keyPath: 'id'});
ãªãã¸ã§ã¯ãã¹ãã¢ã¯ upgradeneeded ãã³ãã©å
ã§ DB ãã¼ã¸ã§ã³ãæ´æ°ãã¦ããéã«ã ããçæ/夿´ãããã¨ãã§ãã¾ãã
ããã¯æè¡çãªå¶éã«ãããã®ã§ãããã³ãã©ã®å¤å´ã§ã¯ãã¼ã¿ã®è¿½å /åé¤/æ´æ°ãå¯è½ã§ããããªãã¸ã§ã¯ãã¹ãã¢ã®å¤æ´ã¯ãã¼ã¸ã§ã³ã®æ´æ°ä¸ã ãã§ãã
ã¢ããã°ã¬ã¼ãããæ¹æ³ã¯ã主ã«2ã¤ããã¾ã:
- ãã¼ã¸ã§ã³ãæ¯è¼ãããã¼ã¸ã§ã³ãã¨ã®æä½ãè¡ãã¾ãã
- ãããã¯ã
db.objectStoreNamesã§æ¢åã®ãªãã¸ã§ã¯ãã¹ãã¢ã®ä¸è¦§ãåå¾ã§ãã¾ãããã®ãªãã¸ã§ã¯ã㯠DOMStringList ã§ãããåå¨ãã§ãã¯ã®ããã®ã¡ã½ããcontains(name)ãæä¾ãã¾ããããã¦åå¨ãããã®ã«å¿ãã¦æ´æ°ãè¡ãã¾ãã
ããã¯ï¼ã¤ç®ã®ã¢ããã¼ãã®å ´åã®ãã¢ã§ã:
let openRequest = indexedDB.open("db", 1);
// åå¨ããªãå ´åã«ã¯ books ã®ããã®ãªãã¸ã§ã¯ãã¹ãã¢ã使ãã
openRequest.onupgradeneeded = function() {
let db = openRequest.result;
if (!db.objectStoreNames.contains('books')) {
db.createObjectStore('books', {keyPath: 'id'});
}
};
ãªãã¸ã§ã¯ãã¹ãã¢ãåé¤ããã«ã¯:
db.deleteObjectStore('books')
ãã©ã³ã¶ã¯ã·ã§ã³
âãã©ã³ã¶ã¯ã·ã§ã³â ã¨ããç¨èªã¯ä¸è¬çã§ãå¤ãã®ãã¼ã¿ãã¼ã¹ã§ä½¿ããã¦ãã¾ãã
ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã°ã«ã¼ãæä½ã§ããããã¹ã¦æåããã/ãã¹ã¦å¤±æãããã®ããããã«ãªãã¾ãã
ä¾ãã°ããã人ãä½ããè³¼å ¥ããã¨ããæ¬¡ã®ãã¨ãå¿ è¦ã§ãã:
- å£åº§ãããéãå¼ãè½ã¨ãã¾ãã
- è³¼å ¥è ã®æã¡ç©ã«è³¼å ¥ããååã追å ãã¾ãã
ãããæåã®å¦çãå®äºãããã®å¾ãä¾ãã°åé»ãªã©ã§ä¸æãå¦çã§ããæ¬¡ã®å¦çã失æããã¨ãé常ã«ã¾ããã§ããããã©ã¡ããæåãã(è³¼å ¥å®äº)ãããã¯å¤±æãã(å°ãªãã¨ãè³¼å ¥è ã¯ãéã¯å¼ããã¦ãããããªãã©ã¤ã§ãã)ã¹ãã§ãã
ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãããä¿è¨¼ãã¾ãã
IndexedDB ã§ã®ãã¹ã¦ã®ãã¼ã¿æä½ã¯ãã©ã³ã¶ã¯ã·ã§ã³å ã§è¡ããªããã°ãªãã¾ããã
ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ããã«ã¯:
db.transaction(store[, type]);
storeã¯ãã©ã³ã¶ã¯ã·ã§ã³ãã¢ã¯ã»ã¹ããã¹ãã¢åã§ããe.g."books"ãè¤æ°ã®ã¹ãã¢ã«ã¢ã¯ã»ã¹ããå ´åã¯ãã¹ãã¢åã®é åãæå®ãã¾ããtypeã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¿ã¤ãã§ãã以ä¸ã®ããããã§ã:readonly: åç §ã®ã¿ãããã©ã«ãã§ããreadwrite: èªã¿æ¸ãå¯è½ã§ããããªãã¸ã§ã¯ãã¹ãã¢ã®å¤æ´ã¯ã§ãã¾ããã
versionchange ã¨ãããã©ã³ã¶ã¯ã·ã§ã³ã¿ã¤ããããã¾ãã: ãã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ã¯ä½ã§ãã§ãã¾ãããæåã§ä½ããã¨ã¯ã§ãã¾ãããIndexedDBã¯ãupdateneeded ãã³ãã©ã®å ´åããã¼ã¿ãã¼ã¹ãéãã¨ãã« versionchange ãã©ã³ã¶ã¯ã·ã§ã³ãèªåçã«ä½æãã¾ãããã®ãããããããã¼ã¿ãã¼ã¹æ§é ã®æ´æ°ããªãã¸ã§ã¯ãã¹ãã¢ã®ä½æ/åé¤ãå¯è½ãªå¯ä¸ã®å ´æã«ãªãã¾ãã
ãã©ã³ã¶ã¯ã·ã§ã³ã readonly ã readwrite ã®ããããã«ã©ãã«ä»ããããå¿
è¦ãããã®ã¯ãããã©ã¼ãã³ã¹ãçç±ã§ãã
å¤ãã® readonly ãã©ã³ã¶ã¯ã·ã§ã³ã¯åãã¹ãã¢ã«åæã«ã¢ã¯ã»ã¹å¯è½ã§ãããreadwrite ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã§ãã¾ãããreadwrite ãã©ã³ã¶ã¯ã·ã§ã³ã¯æ¸ãè¾¼ã¿ã®ããã«ã¹ãã¢ã âããã¯â ãã¾ããæ¬¡ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãåãã¹ãã¢ã«ã¢ã¯ã»ã¹ããåã«ã¾ãã®ãã©ã³ã¶ã¯ã·ã§ã³ãçµäºããã¾ã§å¾
ããªããã°ãªãã¾ããã
ãã©ã³ã¶ã¯ã·ã§ã³ã使ãããããæ¬¡ã®ããã«ãã¦ã¹ãã¢ã«ã¢ã¤ãã ã追å ãããã¨ãã§ãã¾ã:
let transaction = db.transaction("books", "readwrite"); // (1)
// æä½ããããã«ãªãã¸ã§ã¯ãã¹ãã¢ãåå¾
let books = transaction.objectStore("books"); // (2)
let book = {
id: 'js',
price: 10,
created: new Date()
};
let request = books.add(book); // (3)
request.onsuccess = function() { // (4)
console.log("Book added to the store", request.result);
};
request.onerror = function() {
console.log("Error", request.error);
};
åºæ¬çã«4ã¤ã®ã¹ããããããã¾ãã:
- ãã©ã³ã¶ã¯ã·ã§ã³ã使ãã
(1)ã§ã¢ã¯ã»ã¹ãããã¨ãã¦ãããã¹ã¦ã®ã¹ãã¢ã«ã¤ãã¦è¨åãã¾ãã (2)ã§transaction.objectStoreï¼nameï¼ã使ã£ã¦ã¹ãã¢ãªãã¸ã§ã¯ããåå¾ãã¾ãã(3)ã§ãªãã¸ã§ã¯ãã¹ãã¢ã«ãªã¯ã¨ã¹ããå®è¡ãã¾ã:books.add(book)ã- â¦
(4)ã§ãªã¯ã¨ã¹ãã®æå/ã¨ã©ã¼ ãå¦çããå¿ è¦ã«å¿ãã¦ä»ã®ãªã¯ã¨ã¹ããããããªã©ã
ãªãã¸ã§ã¯ãã¹ãã¢ã¯å¤ãæ ¼ç´ããããã®2ã¤ã®ã¡ã½ããããµãã¼ããã¦ãã¾ãã:
-
put(value, [key]) ã¹ãã¢ã«
valueã追å ãã¾ããkeyã¯ããªãã¸ã§ã¯ãã¹ãã¢ãkeyPathãautoIncrementãªãã·ã§ã³ãæã£ã¦ããªãã£ãå ´åã«ã®ã¿æä¾ããã¾ããããåããã¼ããã¤å¤ããã§ã«åå¨ãã¦ããå ´åã«ã¯ãå¤ã¯ç½®ãæãããã¾ãã -
add(value, [key])
putã¨åãã§ãããåããã¼ãæã¤å¤ããã§ã«åå¨ããå ´åããªã¯ã¨ã¹ãã¯å¤±æãã"ConstraintError"ã¨ããååã®ã¨ã©ã¼ãçæããã¾ãã
ãã¼ã¿ãã¼ã¹ãéãã¨ãã¨åãããã«ããªã¯ã¨ã¹ããéä¿¡(books.add(book))ããsuccess/error ã¤ãã³ããã¾ã¡ã¾ãã
addã®å ´åã®request.resultã¯æ°ãããªãã¸ã§ã¯ãã®ãã¼ã§ãã- ã¨ã©ã¼ã¯
request.errorã«ããã¾ã(ããã°)ã
ãã©ã³ã¶ã¯ã·ã§ã³ã®èªåã³ããã
ä¸ã®ä¾ã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ãéå§ãã¦ãadd ãªã¯ã¨ã¹ããè¡ãã¾ããããåã«è¿°ã¹ãããã«ããã©ã³ã¶ã¯ã·ã§ã³ã«ã¯è¤æ°ã®ãªã¯ã¨ã¹ããé¢é£ä»ãããã¨ãå¯è½ã§ããããã¦ãããã¯ãã¹ã¦æåã失æãã®ã©ã¡ããã§ãªãã¨ããã¾ããããã©ã³ã¶ã¯ã·ã§ã³ãçµäºã¨ãã¦ãã¼ã¯ããï¼ãã以ä¸ãªã¯ã¨ã¹ãããªãï¼ã«ã¯ã©ã®ããã«ãããããã§ããããã
ä¸è¨ã§è¨ãã¨: ãã®ãããªãã¨ã¯ãã¾ããã
仿§ã®æ¬¡ã®ãã¼ã¸ã§ã³ 3.0 ã§ã¯ããããããã©ã³ã¶ã¯ã·ã§ã³ãæåã§çµäºãããæ¹æ³ãããã§ãããããä»ã®ã¨ããã2.0 ã«ã¯ããã¾ããã
ãã¹ã¦ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®è¦æ±ãçµäºããmicrotasks queue ã空ã«ãªãã¨ãèªåçã«ã³ãããããã¾ãã
é常ããã©ã³ã¶ã¯ã·ã§ã³ã¯ãã¹ã¦ã®ãªã¯ã¨ã¹ããå®äºããç¾å¨ã®ã³ã¼ããçµäºããã¨ãã«ã³ãããããã¨æ³å®ã§ãã¾ãã
ãªã®ã§ãä¸ã®ä¾ã§ã¯ãã©ã³ã¶ã¯ã·ã§ã³ãçµäºãããããã®ç¹å¥ãªå¼ã³åºãã¯å¿ è¦ããã¾ããã
ãã©ã³ã¶ã¯ã·ã§ã³èªåã³ãããã®ååã«ã¯éè¦ãªå¯ä½ç¨ãããã¾ãããã©ã³ã¶ã¯ã·ã§ã³ã®éä¸ã§ fetch, setTimeout ã¨ãã£ãéåææä½ãæ¿å
¥ãããã¨ãã§ãã¾ãããIndexedDB ã¯ããããçµããã¾ã§ãã©ã³ã¶ã¯ã·ã§ã³ãå¾
æ©ããã¾ããã
以ä¸ã®ã³ã¼ãã§ã¯ãè¡ (*) ã® request2 ã¯å¤±æãã¾ãããã©ã³ã¶ã¯ã·ã§ã³ã¯ãã§ã«ã³ãããããã¦ãããããã§ã¯ã©ããªãªã¯ã¨ã¹ããè¡ããã¨ãã§ããªãããã§ã:
let request1 = books.add(book);
request1.onsuccess = function() {
fetch('/').then(response => {
let request2 = books.add(anotherBook); // (*)
request2.onerror = function() {
console.log(request2.error.name); // TransactionInactiveError
};
});
};
ãã㯠fetch ãéåææä½ãmacrotask ã§ããããã§ãããã©ã³ã¶ã¯ã·ã§ã³ã¯ãã©ã¦ã¶ã macrotask ã®å®è¡ãéå§ããåã«ã¯ãã¼ãºããã¾ãã
IndexedDB 仿§ã®ä½æè ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¯çå½ã§ããã¹ãã ã¨èãã¦ãã¾ãã主ã«ããã©ã¼ãã³ã¹ä¸ã®çç±ããã§ãã
ç¹ã«ãreadwrite ãã©ã³ã¶ã¯ã·ã§ã³ã¯æ¸ãè¾¼ã¿ã®ããã«ã¹ãã¢ã âããã¯â ãã¾ãããããã£ã¦ãã¢ããªã±ã¼ã·ã§ã³ã®ä¸é¨ã books ãªãã¸ã§ã¯ãã¹ãã¢ä¸ã§ readwrite ãéå§ããå ´åãåããã¨ããããã£ãã¢ããªã±ã¼ã·ã§ã³ã®å¥ã®é¨åã¯å¾
æ©ããªããã°ãªãã¾ãããæ°ããªãã©ã³ã¶ã¯ã·ã§ã³ã¯ãæåã®ãã©ã³ã¶ã¯ã·ã§ã³ãçµäºããã¾ã§ âãã³ã°â ãã¾ãã ãã©ã³ã¶ã¯ã·ã§ã³ã«æéããããã¨ãå¥å¦ãªé
å»¶ã«ã¤ãªããå¯è½æ§ãããã¾ãã
ã§ã¯ä½ãããã°ããã§ããããï¼
ä¸ã®ä¾ã§ã¯ãæ°ããªãªã¯ã¨ã¹ã (*) ã®ç´åã«æ°ãã db.transaction ã使ãããã¨ãã§ãã¾ãã
ã§ãããï¼ã¤ã®ãã©ã³ã¶ã¯ã·ã§ã³å ã§æä½ãã¾ã¨ãããå ´åã«ã¯ãIndexedDB ãã©ã³ã¶ã¯ã·ã§ã³é¨å㨠âãã®ä»â ã®éåæé¨åã«åå²ããã®ãããã«è¯ãæ¹æ³ã§ãããã
ã¾ããfetch ããã¦å¿
è¦ã«å¿ãã¦ãã¼ã¿ãæºåãã¾ãããã®å¾ããã©ã³ã¶ã¯ã·ã§ã³ã使ããã¹ã¦ã®ãã¼ã¿ãã¼ã¹ãªã¯ã¨ã¹ããå®è¡ããã¨ããã¾ãæ©è½ãã¾ãã
æ£å¸¸ã«å®äºããç¬éãæ¤ç¥ããã«ã¯ãtransaction.oncomplete ã¤ãã³ãããªãã¹ã³ãã¾ã:
let transaction = db.transaction("books", "readwrite");
// ...æä½ãå®è¡ãã¾ã...
transaction.oncomplete = function() {
console.log("Transaction is complete");
};
complete ã ãããã©ã³ã¶ã¯ã·ã§ã³å
¨ä½ãä¿åããããã¨ãä¿è¨¼ãã¾ããåã
ã®ãªã¯ã¨ã¹ãã¯æåããããããã¾ããããæçµçãªæ¸ãè¾¼ã¿æä½ã¯å¤±æããå¯è½æ§ãããã¾ãï¼ä¾. I/O ã¨ã©ã¼ãªã©ï¼
ãã©ã³ã¶ã¯ã·ã§ã³ãæåã§åæ¢ããã«ã¯ã以ä¸ãå¼ã³åºãã¾ã:
transaction.abort();
ããã«ããããã®ä¸ã®ãªã¯ã¨ã¹ãã«ããè¡ããããã¹ã¦ã®å¤æ´ããã£ã³ã»ã«ããtransaction.onabort ã¤ãã³ããããªã¬ã¼ãã¾ãã
ã¨ã©ã¼ãã³ããªã³ã°
æ¸ãè¾¼ã¿ãªã¯ã¨ã¹ãã¯å¤±æããå¯è½æ§ãããã¾ãã
ããã¯ãããããå´ã§çºçãããã¨ã©ã¼ã ãã§ãªãããã©ã³ã¶ã¯ã·ã§ã³èªä½ã¨ã¯é¢é£ããªãçç±ããçºçãããã¨ãäºæ³ããã¾ããä¾ãã°ãã¹ãã¬ã¼ã¸å®¹éãè¶ ããå ´åã§ãããã®ããããã®ãããªã±ã¼ã¹ãå¦çããæºåãã§ãã¦ããå¿ è¦ãããã¾ãã
ãªã¯ã¨ã¹ãã失æããã¨ããã©ã³ã¶ã¯ã·ã§ã³ã¯èªåçã«ä¸æ¢ããããã¹ã¦ã®å¤æ´ããã£ã³ã»ã«ããã¾ãã
ã±ã¼ã¹ã«ãã£ã¦ã¯ãæ¢åã®å¤æ´ããã£ã³ã»ã«ããã«å¤±æãå¦çï¼ä¾ãã°å¥ã®ãªã¯ã¨ã¹ãã試ã¿ãï¼ãããã©ã³ã¶ã¯ã·ã§ã³ãç¶ç¶ããããã¨ãããã¾ããããã¯å¯è½ã§ããrequest.onerror ãã³ãã©ã§ã¯ãevent.preventDefault() å¼ã³åºãããããã¨ã§ããã©ã³ã¶ã¯ã·ã§ã³ã䏿¢ããªãããã«ãããã¨ãã§ãã¾ãã
以ä¸ã®ä¾ã¯ããã§ã«åå¨ãããã¼ã¨åããã¼ï¼idï¼ã§æ°ããæ¬ã追å ããã¦ãã¾ãããã®å ´åãstore.add ã¡ã½ãã㯠"ConstraintError" ãçæãã¾ãããã®ä¾ã§ã¯ãã©ã³ã¶ã¯ã·ã§ã³ããã£ã³ã»ã«ããã«å¦çãã¦ãã¾ãã:
let transaction = db.transaction("books", "readwrite");
let book = { id: 'js', price: 10 };
let request = transaction.objectStore("books").add(book);
request.onerror = function(event) {
// åã id ã®ãªãã¸ã§ã¯ããæ¢ã«åå¨ããå ´åãConstraintError ãçºçãã¾ã
if (request.error.name == "ConstraintError") {
console.log("Book with such id already exists"); // ã¨ã©ã¼å¦ç
event.preventDefault(); // ãã©ã³ã¶ã¯ã·ã§ã³ã䏿¢ãã¾ãã
// å¥ã®ãã¼ãå©ç¨ããï¼ãªã©
} else {
// unexpected error
// å¦çã§ããªãã®ã§ããã©ã³ã¶ã¯ã·ã§ã³ã¯ä¸æ¢ãã¾ã
}
};
transaction.onabort = function() {
console.log("Error", transaction.error);
};
ã¤ãã³ãå§è²ï¼delegationï¼
ãã¹ã¦ã®ãªã¯ã¨ã¹ãã«å¯¾ã㦠onerror/onsuccess ãå¿ è¦ã§ããããï¼æ¯åã§ã¯ããã¾ãããã®ã§ã代ããã«ã¤ãã³ãå§è²ãå©ç¨ã§ãã¾ãã
IndexedDB ã®ã¤ãã³ãããã«: request â transaction â database.
ãã¹ã¦ã®ã¤ãã³ã㯠ãã£ããã£ãªã³ã°ã¨ãããªã³ã°ãæã¤ DOM ã¤ãã³ãã§ãé常ã¯ãããªã³ã°ã¹ãã¼ã¸ã ããå©ç¨ããã¾ãã
ãããã£ã¦ãã¬ãã¼ããä»ã®ç®çã®ããã« db.onerror ãã³ãã©ã使ç¨ãã¦ãã¹ã¦ã®ã¨ã©ã¼ããã£ãããããã¨ãå¯è½ã§ãã
db.onerror = function(event) {
let request = event.target; // ã¨ã©ã¼ãçºçãããªã¯ã¨ã¹ã
console.log("Error", request.error);
};
â¦ã§ãããä»®ã«ã¨ã©ã¼ãå®å
¨ã«å¦çããããï¼ãã®å ´åã¯ã¬ãã¼ããããã¯ããã¾ããã
request.onerror ã§ event.stopPropagation() ãå©ç¨ãããã¨ã§ãããªã³ã°ãã¤ã¾ã db.onerror ã忢ãããã¨ãã§ãã¾ãã
request.onerror = function(event) {
if (request.error.name == "ConstraintError") {
console.log("Book with such id already exists"); // ã¨ã©ã¼å¦ç
event.preventDefault(); // ãã©ã³ã¶ã¯ã·ã§ã³ã䏿¢ããããªã
event.stopPropagation(); // ã¨ã©ã¼ãããã«ãã¾ãããããèãã¦ãã ãã
} else {
// ä½ããã¾ãã
// ãã©ã³ã¶ã¯ã·ã§ã³ã¯ä¸æ¢ããã¾ã
// transaction.onabort ã§ã¨ã©ã¼ãæ±ããã¨ãã§ãã¾ã
}
};
ãã¼ã§æ¤ç´¢ãã
ãªãã¸ã§ã¯ãã¹ãã¢ã®æ¤ç´¢ã«ã¯ä¸»ã«ï¼ã¤ã®ç¨®é¡ãããã¾ãã:
- ãã¼ or ãã¼ç¯å²ã«ãããã®ãã¤ã¾ããâbooksâ ã¹ãã¬ã¼ã¸ã§ã¯
book.idã§ãã - å¥ã®ãªãã¸ã§ã¯ããã£ã¼ã«ãã«ãããã®ãä¾ãã°ã
book.priceã
æåã«ããã¼ã¨ãã¼ç¯å² (1) ãåãæ±ãã¾ãããã
æ¤ç´¢ãä¼´ãã¡ã½ããã¯ãæ£ç¢ºãªãã¼ ãããã¯ãããã âç¯å²ã¯ã¨ãªâï¼âãã¼ç¯å²â ãæå®ãã IDBKeyRangeãªãã¸ã§ã¯ãï¼ ã®ããããããµãã¼ããã¾ãã
ç¯å²ã¯æ¬¡ã®å¼ã³åºãã使ç¨ãã¦çæããã¾ã:
IDBKeyRange.lowerBound(lower, [open])æå³:â¥lower(openã true ãªã>lower)IDBKeyRange.upperBound(upper, [open])æå³:â¤upper(openã true ãªã<upper)IDBKeyRange.bound(lower, upper, [lowerOpen], [upperOpen])æå³:lowerã¨upperã®é. open ãã©ã°ã true ã®å ´åã対å¿ãããã¼ã¯ç¯å²ã«å«ã¾ãã¾ãããIDBKeyRange.only(key)â åä¸ã®keyã®ã¿ã§æ§æãããç¯å²ã§ããã£ãã«ä½¿ããã¾ããã
ãã¹ã¦ã®æ¤ç´¢ã¡ã½ããã¯æ£ç¢ºãªãã¼ã¾ãã¯ãã¼ç¯å²ã®ããããã® query 弿°ãåãä»ãã¾ãã:
store.get(query)â ãã¼ or ç¯å²ã§ãæåã®å¤ãæ¤ç´¢ãã¾ããstore.getAll([query], [count])â ãã¹ã¦ã®å¤ãæ¤ç´¢ãã¾ããcountãæå®ããã¦ããå ´åã¯ãã®æ°ã§å¶éããã¾ããstore.getKey(query)â ã¯ã¨ãªãæºããæåã®ãã¼ãæ¤ç´¢ãã¾ããé常ã¯ç¯å²ã§ããstore.getAllKeys([query], [count])â ã¯ã¨ãªãæºãããã¹ã¦ã®ãã¼ãæ¤ç´¢ãã¾ããé常ã¯ç¯å²ã§ãcountãæå®ããã¦ããå ´åã¯ãã®æ°ã¾ã§ã§ããstore.count([query])â ã¯ã¨ãªãæºãããã¼ã®ç·æ°ãåå¾ãã¾ï½ï¼é常ã¯ç¯å²ã§ãã
ä¾ãã°ãã¹ãã¢ã«å¤§éã®æ¬(books)ãããã¨ãã¾ããid ãã£ã¼ã«ãã¯ãã¼ãªã®ã§ãããããã¹ã¦ã®ã¡ã½ãã㯠id ã§æ¤ç´¢ãã§ãããã¨ãå¿ããªãã§ãã ããã
ãªã¯ã¨ã¹ãä¾:
// åä¸ã®æ¬ãåå¾
books.get('js')
// 'css' <= id <= 'html' ã®æ¬ãåå¾
books.getAll(IDBKeyRange.bound('css', 'html'))
// id < 'html' ã®æ¬ãåå¾
books.getAll(IDBKeyRange.upperBound('html', true))
// ãã¹ã¦ã®æ¬ãåå¾
books.getAll()
// id > 'js' ã®ãã¹ã¦ã®ãã¼ãåå¾
books.getAllKeys(IDBKeyRange.lowerBound('js', true))
ãªãã¸ã§ã¯ãã¹ãã¢ã¯å é¨çã«ããã¼ã«ããå¤ãã½ã¼ããã¦ãã¾ãã
ãã®ãããå¤ãã®å¤ãè¿ããªã¯ã¨ã¹ãã¯ã常ã«ãã¼é ã«ã½ã¼ããããçµæãè¿ãã¾ãã
index ä»ãã®ä»»æã®ãã£ã¼ã«ãã§æ¤ç´¢ãã
ä»ã®ãªãã¸ã§ã¯ããã£ã¼ã«ãã§æ¤ç´¢ããã«ã¯ãâindexâ ã¨å¼ã°ãã追å ã®ãã¼ã¿æ§é ãçæããå¿ è¦ãããã¾ãã
index ã¯ç¹å®ã®ãªãã¸ã§ã¯ããã£ã¼ã«ãã追跡ããã¹ãã¢ã¸ã® âã¢ããªã³â ã§ãããã®ãã£ã¼ã«ãã®å¤ãã¨ã«ããã®å¤ãæã¤ãªãã¸ã§ã¯ãã®ãã¼ã®ãªã¹ããæ ¼ç´ãã¾ãã以ä¸ã«ãã詳細ãªå³ãããã¾ãã
æ§æ:
objectStore.createIndex(name, keyPath, [options]);
nameâ index å,keyPathâ index ã追跡ãã¹ããªãã¸ã§ã¯ããã£ã¼ã«ãã®ãã¹ï¼å°æ¥ãã®ãã£ã¼ã«ãã§æ¤ç´¢ãã¾ãï¼optionâ æ¬¡ã®ããããã£ããã¤ãªãã·ã§ã³ã®ãªãã¸ã§ã¯ã:uniqueâ true ã®å ´åãã¹ãã¢ã«ã¯keyPathã§æå®ãããå¤ããã¤ãªãã¸ã§ã¯ãã1ã¤ãããªããã¨ã示ãã¾ããéè¤ã追å ãããã¨ããå ´åãindex ã¯ã¨ã©ã¼ãçæãããã¨ã§ãããå¼·å¶ãã¾ããmultiEntryâkeyPathã®å¤ãé åã®å ´åã«ã®ã¿ä½¿ããã¾ãããã®å ´åãããã©ã«ãã§ã¯ index ã¯é åå ¨ä½ããã¼ã¨ãã¦æ±ãã¾ãããmultiEntryã true ã®å ´åã¯ãindex ã¯é åå ã®åå¤ã®ã¹ãã¢ãªãã¸ã§ã¯ãã®ãªã¹ããç¶æãã¾ãããããã£ã¦ãé åè¦ç´ 㯠index ãã¼ã«ãªãã¾ãã
ããããã®ä¾ã§ã¯ãid ã§ãã¼è¨å®ãããæ¬ãæ ¼ç´ãã¦ãã¾ãã
ããã§ãprice ã§æ¤ç´¢ãããã¨ãã¾ãããã
ã¾ããindex ã使ããå¿
è¦ãããã¾ãããªãã¸ã§ã¯ãã¹ãã¢åæ§ãupgradeneeded ã§è¡ããªããã°ãªãã¾ããã:
openRequest.onupgradeneeded = function() {
// index ã¯ããããã¼ã¸ã§ã³å¤æ´ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®ä¸ã§ä½æããå¿
è¦ãããã¾ã
let books = db.createObjectStore('books', {keyPath: 'id'});
let index = books.createIndex('price_idx', 'price');
};
- index ã¯
priceãã£ã¼ã«ãã追跡ãã¾ãã - priceï¼ä¾¡æ ¼ï¼ã¯ã¦ãã¼ã¯ã§ã¯ãªãã®ã§ãåãä¾¡æ ¼ã§è¤æ°ã®æ¬ãåå¨ããå¯è½æ§ãããã¾ãããã®ããã
uniqueãªãã·ã§ã³ã¯è¨å®ãã¾ããã - priceï¼ä¾¡æ ¼ï¼ã¯é
åã§ã¯ãªãã®ã§ã
multiEntryãã©ã°ã¯é©ç¨ããã¾ããã
inventory ã«4åã®æ¬ãããã¨ãã¾ãããã㯠index ãä½ã§ããããæ£ç¢ºã«ç¤ºãå³ã§ã:
æ¢ã«è¿°ã¹ãéããprice ï¼2ã¤ç®ã®å¼æ°ï¼ã®åå¤ã® index ã¯ããã® ä¾¡æ ¼ ããã¤ãã¼ã®ä¸è¦§ãä¿æãã¾ãã
index ã¯èªåã§ææ°ç¶æ ãç¶æãããã®ã§ãæ°ã«ããå¿ è¦ã¯æãã¾ããã
ãã¾ãç¹å®ã®ä¾¡æ ¼ã§æ¤ç´¢ããããå ´åãåã« index ã«å¯¾ãã¦åãæ¤ç´¢ã¡ã½ãããé©ç¨ããã ãã§ãã:
let transaction = db.transaction("books"); // readonly
let books = transaction.objectStore("books");
let priceIndex = books.index("price_idx");
let request = priceIndex.getAll(10);
request.onsuccess = function() {
if (request.result !== undefined) {
console.log("Books", request.result); // price=10 ã®æ¬ã®é
å
} else {
console.log("No such books");
}
};
IDBKeyRange ã§ç¯å²ã使ããå®ã/é«ãæ¬ãæ¢ããã¨ãã§ãã¾ã:
// price <= 5 ã®æ¬ãè¦ã¤ãã
let request = priceIndex.getAll(IDBKeyRange.upperBound(5));
index ã¯å
é¨çã«ã¯è¿½è·¡ããã¦ãããªãã¸ã§ã¯ããã£ã¼ã«ãï¼ãã®ã±ã¼ã¹ã§ã¯ priceï¼ã§ã½ã¼ãããã¦ãã¾ãããªã®ã§ãæ¤ç´¢ããã¨ããçµæãã¾ã price ã§ã½ã¼ãããã¦ãã¾ãã
ã¹ãã¢ããåé¤ãã
delete ã¡ã½ããã¯ã¯ã¨ãªã«ãã£ã¦åé¤ããå¤ã調ã¹ã¾ããå¼ã³åºãå½¢å¼ã¯ getAll ã¨åãã§ã:
delete(query)â ã¯ã¨ãªã«ãããããå¤ãåé¤ãã¾ã
ä¾:
// id='js' ã®æ¬ãåé¤ãã¾ã
books.delete('js');
ä¾¡æ ¼ ãããã¯å¥ã®ãªãã¸ã§ã¯ããã£ã¼ã«ããå
ã«æ¬ãåé¤ãããå ´åã¯ãæåã« index ã§ãã¼ãè¦ã¤ãããã®å¾ã« delete ãå¼ã³åºãã¾ãã:
// price = 5 ã®ãã¼ãè¦ã¤ãã
let request = priceIndex.getKey(5);
request.onsuccess = function() {
let id = request.result;
let deleteRequest = books.delete(id);
};
ãã¹ã¦ã®åé¤ããã«ã¯:
books.clear(); // ã¹ãã¬ã¼ã¸ãã¯ãªã¢ãã¾ã
ã«ã¼ã½ã«ï¼Cursorsï¼
getAll/getAllKeys ã®ãããªã¡ã½ãã㯠ãã¼/å¤ ã®é
åãè¿ãã¾ãã
ã§ããããªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸ã¯å·¨å¤§ã«ãªããå©ç¨å¯è½ãªã¡ã¢ãªããã大ãããªãå¯è½æ§ãããã¾ããgetAll ã¯ãã¹ã¦ã®ã¬ã³ã¼ããé
åã¨ãã¦åå¾ãããã¨ã¯ã§ããªãã§ãããã
ä½ããããããã§ãããï¼
ã«ã¼ã½ã«ã¯ãããåé¿ããææ®µãæä¾ãã¾ãã
ã«ã¼ã½ã« ã¯ä¸ããããã¯ã¨ãªã§ãªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸ã横æããç¹å¥ãªãªãã¸ã§ã¯ãã§ãä¸åº¦ã«1ã¤ã®ãã¼/å¤ãè¿ããããã¡ã¢ãªãç¯ç´ãã¾ãã
ãªãã¸ã§ã¯ãã¹ãã¢ã¯å é¨çã«ã¯ãã¼ã§ã½ã¼ãããã¦ããã®ã§ãã«ã¼ã½ã«ã¯ãã¼é ï¼ããã©ã«ãã§ã¯æé ï¼ã§ã¹ãã¢ãç§»åãã¾ãã
æ§æ:
// getAll ã¨ä¼¼ã¦ãã¾ãã ã«ã¼ã½ã«ã«å¯¾ãã¦ã§ã:
let request = store.openCursor(query, [direction]);
// å¤ã§ã¯ãªããã¼ãå¾ãã«ã¯ï¼getAllKeysã®ãããªï¼: store.openKeyCursor
queryã¯ãã¼ã¾ãã¯ãã¼ç¯å²ã§ãgetAllã¨åãã§ããdirectionã¯ãªãã·ã§ã³ã®å¼æ°ã§ã使ç¨ããé åºã§ã:"next"â ããã©ã«ãã§, ã«ã¼ã½ã«ã¯æãå°ãããã¼ã®ã¬ã³ã¼ãããä¸ã«ç§»åãã¾ãã"prev"â éé ã§ã: æã大ããªãã¼ãæã¤ã¬ã³ã¼ãããä¸ã«ç§»åãã¾ãã"nextunique","prevunique"â ä¸ã¨åãã§ãããåããã¼ãæã¤ã¬ã³ã¼ããã¹ããããã¾ãï¼index ä¸ã®ã«ã¼ã½ã«ã®ã¿ãä¾: price=5 ã®è¤æ°ã®æ¬ã®å ´åãæåã®1åã ããè¿å´ããã¾ãï¼ã
ã«ã¼ã½ã«ã®ä¸»ãªéã㯠request.onsuccess ãè¤æ°åããªã¬ã¼ããããã¨ã§ã: åçµæã«å¯¾ã1度ããªã¬ã¼ããã¾ãã
ããã¯ãã«ã¼ã½ã«ã®ä½¿ç¨ä¾ã§ã:
let transaction = db.transaction("books");
let books = transaction.objectStore("books");
let request = books.openCursor();
// ã«ã¼ã½ã«ã§è¦ã¤ãã£ã忬ã«å¯¾ãã¦å¼ã³åºããã¾ã
request.onsuccess = function() {
let cursor = request.result;
if (cursor) {
let key = cursor.key; // book key (id ãã£ã¼ã«ã)
let value = cursor.value; // book ãªãã¸ã§ã¯ã
console.log(key, value);
cursor.continue();
} else {
console.log("No more books");
}
};
主ãªã«ã¼ã½ã«ã¡ã½ããã¯ä»¥ä¸ã§ã:
advance(count)â ã«ã¼ã½ã«ãcountæ°é²ããå¤ãã¹ããããã¾ããcontinue([key])â ãããããç¯å²ã®æ¬¡ã®å¤ã«ã«ã¼ã½ã«ãé²ãã¾ãï¼ãããã¯æå®ãããå ´åã¯ããã®keyã®ç´å¾ï¼
ã«ã¼ã½ã«ã«ä¸è´ããå¤ããã£ã¨ãããå¦ãã¯ãonsuccess ãå¼ã³åºããå¾ result ãè¦ããã¨ã§ã次ã®ã¬ã³ã¼ããæãã«ã¼ã½ã«ããã㯠undefined ãåå¾ã§ãã¾ãã
ä¸è¨ã®ä¾ã§ã¯ããªãã¸ã§ã¯ãã¹ãã¢ç¨ã®ã«ã¼ã½ã«ã使ããã¾ããã
ããããindex ä¸ã«ã«ã¼ã½ã«ã使ãããã¨ãã§ãã¾ãã御åç¥ã®éããindex ãå©ç¨ãããã¨ã§ãªãã¸ã§ã¯ããã£ã¼ã«ãã§æ¤ç´¢ãããã¨ãã§ãã¾ããindex ä¸ã®ã«ã¼ã½ã«ã¯ãªãã¸ã§ã¯ãã¹ãã¢ä¸ã®ã«ã¼ã½ã«ã¨ã¾ã£ããåãããã«æ©è½ãã¾ããã¤ã¾ããä¸åº¦ã«ï¼ã¤ã®å¤ãè¿ããã¨ã§ã¡ã¢ãªãç¯ç´ãã¾ãã
index ä¸ã®ã«ã¼ã½ã«ã®å ´åãcursor.key 㯠index ãã¼ï¼ä¾, price ï¼ã§ããããªãã¸ã§ã¯ããã¼ã«å¯¾ãã¦ã¯ cursor.primaryKey ããããã£ã使ç¨ããå¿
è¦ãããã¾ã:
let request = priceIdx.openCursor(IDBKeyRange.upperBound(5));
// called for each record
request.onsuccess = function() {
let cursor = request.result;
if (cursor) {
let primaryKey = cursor.primaryKey; // 次ã®ãªãã¸ã§ã¯ãã¹ãã¢ãã¼(id ãã£ã¼ã«ã)
let value = cursor.value; // 次ã®ãªãã¸ã§ã¯ãã¹ãã¢ãªãã¸ã§ã¯ã (book ãªãã¸ã§ã¯ã)
let key = cursor.key; // 次㮠index ãã¼ (price)
console.log(key, value);
cursor.continue();
} else {
console.log("No more books");
}
};
Promise ã©ããã¼
ãã¹ã¦ã®ãªã¯ã¨ã¹ãã« onsuccess/onerror ã追å ããã®ã¯ã¨ã¦ãé¢åãªä½æ¥ã§ããã¤ãã³ãå§è²ã使ç¨ãããã¨ã§ã楽ã«ã§ããå ´åããããã¨ãããã¾ããä¾ãã°ããã©ã³ã¶ã¯ã·ã§ã³å
¨ä½ã«ãã³ãã©ãè¨å®ãã¾ãããasync/await ã¯ã¯ããã«ä¾¿å©ã§ãã
ãã®ãã£ãã¿ã¼ã§ã¯ãèãPromise ã©ããã¼ https://github.com/jakearchibald/idb ã使ã£ã¦ã¿ã¾ãããããã㯠promise å ããã IndexedDB ã¡ã½ãããæã¤ãã°ãã¼ãã«ãª idb ãªãã¸ã§ã¯ããçæãã¾ãã
ããã¨ãonsuccess/onerror ã®ä»£ããã«ã次ã®ããã«è¨è¿°ãããã¨ãã§ãã¾ã:
let db = await idb.openDB('store', 1, db => {
if (db.oldVersion == 0) {
// åæåã®å®è¡
db.createObjectStore('books', {keyPath: 'id'});
}
});
let transaction = db.transaction('books', 'readwrite');
let books = transaction.objectStore('books');
try {
await books.add(...);
await books.add(...);
await transaction.complete;
console.log('jsbook saved');
} catch(err) {
console.log('error', err.message);
}
âé常㮠async ã³ã¼ãâ 㨠âtryâ¦catchâ ã ãã«ãªãã¾ãã
ã¨ã©ã¼ãã³ããªã³ã°
ã¨ã©ã¼ããã£ããããªãå ´åãæãè¿ãå¤å´ã® try...catch ã¾ã§ã¨ã©ã¼ããã¾ãã
ãã£ãããããªãã£ãã¨ã©ã¼ã¯ window ãªãã¸ã§ã¯ãã®"æªå¦çã® prmise æå¦" ã¤ãã³ãã«ãªãã¾ãã
次ã®ããã«ãã¦ããã®ãããªã¨ã©ã¼ãå¦çãããã¨ãã§ãã¾ã:
window.addEventListener('unhandledrejection', event => {
let request = event.target; // IndexedDB ãã¤ãã£ãã®ãªã¯ã¨ã¹ããªãã¸ã§ã¯ã
let error = event.reason; // æªå¦çã®ã¨ã©ã¼ãªãã¸ã§ã¯ããrequest.error ã¨åã
...report about the error...
});
âéã¢ã¯ãã£ããªãã©ã³ã¶ã¯ã·ã§ã³â ã®è½ã¨ãç©´
ãã§ã«ãåç¥ã®ããã«ããã©ã¦ã¶ãç¾å¨ã®ã³ã¼ã㨠microtask ãå®è¡ããã¨ããã«ãã©ã³ã¶ã¯ã·ã§ã³ã¯èªåã³ãããããã¾ãããã®ããããã©ã³ã¶ã¯ã·ã§ã³ä¸ã« fetch ã®ãã㪠macrotask ãç½®ããå ´åããã©ã³ã¶ã¯ã·ã§ã³ã¯ãã®çµäºãå¾
ããèªåã³ããããã¾ãããããã£ã¦ã次ã®ãªã¯ã¨ã¹ãã¯å¤±æããã§ãããã
promise ã©ããã¼ã async/await ã®å ´åãåãã§ãã
ããã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®éä¸ã« fetch ãããä¾ã§ã:
let transaction = db.transaction("inventory", "readwrite");
let inventory = transaction.objectStore("inventory");
await inventory.add({ id: 'js', price: 10, created: new Date() });
await fetch(...); // (*)
await inventory.add({ id: 'js', price: 10, created: new Date() }); // Error
fetch (*) ã®å¾ã«ããæ¬¡ã® inventory.add 㯠âéã¢ã¯ãã£ããªãã©ã³ã¶ã¯ã·ã§ã³â ã¨ã©ã¼ã§å¤±æãã¾ãããã®æç¹ã§ãã©ã³ã¶ã¯ã·ã§ã³ã¯æ¢ã«ã³ãããããã¯ãã¼ãºããã¦ããããã§ãã
åé¿çã¯ãã¤ãã¤ãã®IndexedDB ã使ç¨ããå ´åã¨åãã§ããæ°ããªãã©ã³ã¶ã¯ã·ã§ã³ãä½ãããåã«ç©äºãåå²ããããã§ãã
- ãã¼ã¿ãæºåããæåã«å¿ è¦ãªãã®ããã¹ã¦åå¾ãã¾ãã
- 次ã«ããã¼ã¿ãã¼ã¹ã«ä¿åãã¾ãã
ãã¤ãã£ããªãã¸ã§ã¯ããåå¾ãã
å
é¨çã«ã¯ãã©ããã¼ã¯ onerror/onsuccess ã追å ããããã¤ãã¤ãã® IndexedDB ãªã¯ã¨ã¹ããå®è¡ãããã®çµæã reject/resolve ãã promise ãè¿ãã¾ãã
ã»ã¨ãã©ã®å ´åãããã§åé¡ãªãåä½ãã¾ããä¾ã¯ã©ã¤ãã©ãªã®ãã¼ã¸ https://github.com/jakearchibald/idb ã«ããã¾ãã
ã¬ã¢ã±ã¼ã¹ã§ããããªãªã¸ãã«ã® request ãªãã¸ã§ã¯ããå¿
è¦ãªã¨ãã¯ãpromise ã® promise.request ããããã£ã§ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ã:
let promise = books.add(book); // promise ãåå¾ãã¾ã (await ã¯ä¸è¦)
let request = promise.request; // ãã¤ãã£ãã®ãªã¯ã¨ã¹ããªãã¸ã§ã¯ã
let transaction = request.transaction; // ãã¤ãã£ãã®ãã©ã³ã¶ã¯ã·ã§ã³ãªãã¸ã§ã¯ã
// ...do some native IndexedDB voodoo...
let result = await promise; // å¿
è¦ã§ããã°
ãµããª
IndexedDB ã¯ã·ã³ãã«ãª key-value ãã¼ã¿ãã¼ã¹ã§ããããªãã©ã¤ã³ã¢ããªã±ã¼ã·ã§ã³ã«ã¯ååå¼·åãªãã®ã§ããã¤ã¤ã使ãããããã®ã§ãã
æè¯ã®ããã¥ã¢ã«ã¯ä»æ§ã§ããç¾å¨ã®ã㮠㯠2.0 ã§ããã3.0 ã®ããã¤ãã®ã¡ã½ããï¼å¤§ããªéãã¯ããã¾ããï¼ã¯é¨åçã«ãµãã¼ãããã¦ãã¾ãã
åºæ¬çãªä½¿ç¨æ¹æ³ã¯æ¬¡ã®ãã§ã¼ãºã§èª¬æã§ãã¾ã:
- idb ã®ãã㪠promise ã©ããã¼ãåå¾ãã¾ãã
- ãã¼ã¿ãã¼ã¹ããªã¼ãã³ãã¾ã
idb.openDb(name, version, onupgradeneeded) - ãªã¯ã¨ã¹ãã®å ´å:
- ãã©ã³ã¶ã¯ã·ã§ã³ã使ãã¾ã
db.transaction('books')(å¿ è¦ã«å¿ãã¦èªã¿æ¸ã)ã - ãªãã¸ã§ã¯ãã¹ãã¢ãåå¾ãã¾ã
transaction.objectStore('books')ã
- ãã©ã³ã¶ã¯ã·ã§ã³ã使ãã¾ã
- 次ã«ããã¼ã§æ¤ç´¢ããããã«ãªãã¸ã§ã¯ãã¹ãã¢ã®ã¡ã½ãããç´æ¥å¼ã³åºãã¾ãã
- ãªãã¸ã§ã¯ããã£ã¼ã«ãã§æ¤ç´¢ããå ´åã«ã¯ index ã使ãã¾ãã
- ãã¼ã¿ãã¡ã¢ãªã«åã¾ããªãå ´åã«ã¯ãã«ã¼ã½ã«ã使ç¨ãã¾ãã
ããã¯å°ããªãã¢ã¢ããªã§ã:
<!doctype html>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/idb.min.js"></script>
<button onclick="addBook()">Add a book</button>
<button onclick="clearBooks()">Clear books</button>
<p>Books list:</p>
<ul id="listElem"></ul>
<script>
let db;
init();
async function init() {
db = await idb.openDb('booksDb', 1, db => {
db.createObjectStore('books', {keyPath: 'name'});
});
list();
}
async function list() {
let tx = db.transaction('books');
let bookStore = tx.objectStore('books');
let books = await bookStore.getAll();
if (books.length) {
listElem.innerHTML = books.map(book => `<li>
name: ${book.name}, price: ${book.price}
</li>`).join('');
} else {
listElem.innerHTML = '<li>No books yet. Please add books.</li>'
}
}
async function clearBooks() {
let tx = db.transaction('books', 'readwrite');
await tx.objectStore('books').clear();
await list();
}
async function addBook() {
let name = prompt("Book name?");
let price = +prompt("Book price?");
let tx = db.transaction('books', 'readwrite');
try {
await tx.objectStore('books').add({name, price});
await list();
} catch(err) {
if (err.name == 'ConstraintError') {
alert("Such book exists already");
await addBook();
} else {
throw err;
}
}
}
window.addEventListener('unhandledrejection', event => {
alert("Error: " + event.reason.message);
});
</script>
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã