IndexedDBは、ローカルストレージと同じようにKey-Valueストアではありません。ローカルストレージは文字列を格納するだけなので、オブジェクトをローカルストレージに配置する通常の方法は JSON.stringify itです。
myObject = {a: 1, b: 2, c: 3};
localStorage.setItem("uniq", JSON.stringify(myObject));
これは、キーuniq
でオブジェクトを見つけるのに適していますが、myObjectのプロパティをローカルストレージから戻す唯一の方法は、オブジェクトをJSON.parseして調べます。
var myStorageObject = JSON.parse(localStorage.getItem("uniq"));
window.alert(myStorageObject.b);
ローカルストレージにオブジェクトが1つまたは少数しかない場合は、これで問題ありません。しかし、1,000個のオブジェクトがあり、そのすべてにb
のプロパティがあり、b==2
のオブジェクトだけで何かを実行したいとします。ローカルストレージでは、ストア全体をループして、各アイテムのb
を確認する必要があります。これは、多くの無駄な処理です。
IndexedDBを使用すると、 値の文字列以外のもの を格納できます:「これには、DOMStringやDateなどの単純な型と、ObjectおよびArrayインスタンスが含まれます。それだけでなく、値に格納したオブジェクトのプロパティに対して インデックスの作成 を実行できます。したがって、IndexedDbを使用すると、同じ1000個のオブジェクトをその中に配置できますが、b
プロパティにインデックスを作成し、それを使用して、ストア内のすべてのオブジェクトをスキャンするオーバーヘッドなしで、b==2
のオブジェクトを取得できます。
少なくともそれは考えです。 IndexedDB APIはあまり直感的ではありません。
非同期呼び出しが行われたときと同じスレッドで実行されているように見えます。これはどのようにUIをブロックしませんか?
非同期はマルチスレッドと同じではありません JavaScriptは原則としてマルチスレッドではありません 。 UIのブロックを最小限にしたい場合は、JSで重い処理を行うとUIがブロックされます Web Workers 。
indexedDBでは、より大きなストアを使用できます。 HTML5ストアのサイズを増やしてみませんか?
なぜなら、適切な索引付けを行わないと、取得したサイズが大きくなるほど、処理速度が遅くなるからです。
Robertの回答に加えて、indexedDBは「範囲」を知っているため、「ab」で始まり「abd」で終わるすべてのレコードを検索および取得して、「abc」などを見つけることができます。
Localstorageとindexeddbとその他の可能なオプションについて議論しているこの良い記事に出くわしました。
(以下の値はすべてミリ秒単位です)
https://nolanlawson.com/2015/09/29/indexeddb-websql-localstorage-what-blocks-the-dom/
記事から要約すると(完全に著者の見解)、
FirefoxとChromeの両方で、基本的なKey-Valueの挿入に関して、IndexedDBはLocalStorageよりも遅く、それでもDOMをブロックします。 Chromeでは、DOMをブロックするWebSQLよりも低速ですが、それほどではありません。 EdgeとSafariでのみ、IndexedDBはUIを中断することなくバックグラウンドで実行できます。さらに、これらは、IndexedDB仕様を部分的にしか実装していない2つのブラウザーです。
IndexedDBは、ほぼ同じ速度で実行されますが、DOMをブロックすることなく、Webワーカーでうまく機能します。唯一の例外はSafariです。これはワーカー内でIndexedDBをサポートしていませんが、UIをブロックしません。
ローカルメモリは、データがシンプルで最小限の場合に理想的です
ブラウザのコンソールで以下を実行します。 LocalStorageおよびSessionStorageとともに、Application> Storageに個別のエンティティを作成します
const request = indexedDB.open("notes");
request.onupgradeneeded = e => {
alert("upgrade");
}
request.onsuccess = e => {
alert("success");
}
request.onerror = e => {
alert("error");
}
柔軟性と機能が低い他の2つのストレージとは異なり、すべてのCRUD操作でこのストレージをクエリできます。