2011-05-07 61 views
60
  1. indexedDB和本地存储都是关键值存储。有两个关键/价值商店的优势是什么?
  2. indexedDB是异步的,但连接(最耗时的事情) 是手动。他们似乎运行在异步调用 的同一线程中。这将如何阻止用户界面?
  3. indexedDB允许更大的商店。为什么不增加HTML5商店的尺寸 ?
  4. 我在挠我的脑袋。 indexedDB有什么意义?

回答

84

与本地存储相同,IndexedDB不是键值存储。本地存储只是存储字符串,因此把在本地存储的对象通常的做法是JSON.stringify它:

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); 

这是好的,如果你只有一个或几个对象,在本地存储。但想象一下,你有一千件物品,所有这些物品都有一个属性b,而你想要做的只是那些b==2。使用本地存储时,您必须遍历整个商店,并在每个项目上检查b,这是浪费的处理过程。

使用IndexedDB,您可以存储stuff other than strings in the value:“这包括简单类型,如DOMString和Date以及Object和Array实例。”不仅如此,您可以在您存储在值中的对象的属性create indexes上。因此,通过IndexedDb,您可以将相同的一千个对象放入其中,但在b属性上创建一个索引,并使用该索引检索对象,其中b==2没有扫描存储中每个对象的开销。

至少这是主意。 IndexedDB API不太直观。

它们似乎与异步调用发生在同一线程中。这将如何阻止用户界面?

异步与多线程不同,JavaScript, as a rule, is not multi-threaded。如果你想最大限度地阻止UI尝试,你在JS中执行的任何繁重处理都会阻止用户界面尝试Web Workers

indexedDB允许更大的商店。为什么不增加HTML5商店的大小?

因为如果没有合适的索引,它会变得越慢越大。

+2

您可能还需要请查看以下[问题]的答案(http:// stackoverflow。com/questions/14314065/are-cookie-read-write-atomic-in-browser),以了解在本地存储时IndexedDB如何支持事务。没有事务支持可能是浏览器(如Chrome和Opera)使用多标签/窗口访问本地存储的问题,每个标签页使用单独的进程/线程。 – Stefan 2013-02-16 11:24:23

+0

另外,indexeddb是网页和在其上运行的服务人员之间的通信模式。服务人员无法访问localStorage。 – Awol 2016-09-12 07:14:50

+0

indexedDB api确实不是非常直观,但有一些包装库,如[Dexie](http://dexie.org/),它使事情变得更容易 – fengshuo 2017-12-05 19:41:45

5

添加到robertc的anwser,IndexedDB的知道“范围”,所以你可以搜索和检索以“AB”开头的所有记录,并与ABD结束”找到‘ABC’等