--- title: IDBDatabase slug: Web/API/IDBDatabase tags: - IDBDatabase translation_of: Web/API/IDBDatabase ---
{{APIRef("IndexedDB")}}
IndexedDB 中的 IDBDatabase
接口提供一个到 数据库的连接; 你可以使用 IDBDatabase
对象在数据库中打开一个transaction , 然后进行操作或者删除数据库中的对象。这是唯一一个能够访问和管理数据库版本的接口。
{{AvailableInWorkers}}
注意:在IndexedDB中所做的所有事情总是发生在事务的上下文中,表示与数据库中的数据的交互。IndexedDB中的所有对象——包括对象存储、索引和游标——都与特定事务绑定。因此,在事务之外您不能执行命令、访问数据或打开任何东西。
注意:请注意,从Firefox 40开始,IndexedDB事务具有宽松的持久性保证以提高性能(请参阅bug 1112702)以前在readwrite
事务中IDBTransaction.oncomplete
被触发只有当所有数据都保证已刷新到磁盘时。在Firefox 40+中,complete
事件在操作系统被告知写入数据之后被触发,但可能在该数据实际上被刷新到磁盘之前。该complete
因此,事件可以比以前更快地传递,但是,如果操作系统崩溃或者在将数据刷新到磁盘之前系统电源丢失,则整个事务将丢失的可能性很小。由于这种灾难性事件很少见,大多数消费者不应该进一步关注自己。如果由于某种原因必须确保持久性(例如,您要存储以后无法重新计算的关键数据),则可以complete
通过使用实验(非标准)readwriteflush
模式创建事务来强制事务在传递事件之前刷新到磁盘(请参阅IDBDatabase.transaction
)。
继承自: EventTarget
当数据库结构发生更改时触发
({{domxref("IDBOpenDBRequest.onupgradeneeded")}}事件或在其他地方请求
{{domxref("IDBFactory.deleteDatabase")}} 时(最可能在同一台计算机上的另一个窗口/选项卡中)这与版本更改事务(请参阅参考资料{{domxref("IDBVersionChangeEvent")}})不同,但它是相关的。
在下面的代码中, 异步打开了一个数据库连接 ({{domxref("IDBFactory")}}), 并处理成功或者异常事件, 如果触发了upgrade事件就需要创建一个新的object store ({{ domxref("IDBdatabase") }})。如果想看完整的例子, 可以使用 To-do Notifications 应用(view example live.)
// 我们先打开一个数据库 var DBOpenRequest = window.indexedDB.open("toDoList", 4); // 当数据库打开出错/成功时,以下两个事件处理程序将分别对IDBDatabase对象进行下一步操作 DBOpenRequest.onerror = function(event) { note.innerHTML += '<li>Error loading database.</li>'; }; DBOpenRequest.onsuccess = function(event) { note.innerHTML += '<li>Database initialised.</li>'; // 将打开数据库的结果存储在db变量中,该变量将在后面的代码中被频繁使用 db = DBOpenRequest.result; // 运行displayData()方法,用IDB中已经存在的所有待办事项列表数据填充到任务列表中 displayData(); }; // 当试图打开一个尚未被创建的数据库,或者试图连接一个数据库还没被创立的版本时,onupgradeneeded事件会被触发 DBOpenRequest.onupgradeneeded = function(event) { var db = event.target.result; db.onerror = function(event) { note.innerHTML += '<li>Error loading database.</li>'; }; // 使用IDBDatabase.createObjectStore方法,可创建一个对象存储区 var objectStore = db.createObjectStore("toDoList", { keyPath: "taskTitle" }); // 定义objectStore将包含哪些数据项 objectStore.createIndex("hours", "hours", { unique: false }); objectStore.createIndex("minutes", "minutes", { unique: false }); objectStore.createIndex("day", "day", { unique: false }); objectStore.createIndex("month", "month", { unique: false }); objectStore.createIndex("year", "year", { unique: false }); objectStore.createIndex("notified", "notified", { unique: false }); note.innerHTML += '<li>Object store created.</li>'; };
下一行打开数据库上的事务,然后打开一个对象存储,然后我们可以在其中操作数据。
var objectStore = db.transaction('toDoList').objectStore('toDoList');
Specification | Status | Comment |
---|---|---|
{{SpecName('IndexedDB', '#idl-def-IDBDatabase', 'IDBDatabase')}} | {{Spec2('IndexedDB')}} |
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support | 23{{property_prefix("webkit")}} 24 |
10 {{property_prefix("moz")}} {{CompatGeckoDesktop("16.0")}} |
10, partial | 15 | 7.1 |
Available in workers | {{CompatVersionUnknown}} | {{CompatGeckoMobile("37.0")}} | {{CompatUnknown}} | {{CompatVersionUnknown}} | {{CompatUnknown}} |
Feature | Android | Firefox Mobile (Gecko) | Firefox OS | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | 4.4 | {{CompatGeckoMobile("22.0")}} | 1.0.1 | 10 | 22 | 8 |
Available in workers | {{CompatVersionUnknown}} | {{CompatGeckoMobile("37.0")}} | {{CompatVersionUnknown}} | {{CompatUnknown}} | {{CompatVersionUnknown}} | {{CompatUnknown}} |
Be careful in Chrome as it still implements the old specification along with the new one. Similarly it still has the prefixed webkitIndexedDB
property even if the unprefixed indexedDB
is present.