💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 第三节:indexedDB 对象 浏览器原生提供`indexedDB`对象,作为开发者的操作接口。 ## 一、indexedDB.open() `indexedDB.open()`方法用于打开数据库。这是一个异步操作,但是会立刻返回一个 IDBOpenDBRequest 对象。 ~~~ var openRequest = window.indexedDB.open('test', 1); ~~~ 上面代码表示,打开一个名为`test`、版本为`1`的数据库。如果该数据库不存在,则会新建该数据库。 `open()`方法的第一个参数是数据库名称,格式为字符串,不可省略;第二个参数是数据库版本,是一个大于`0`的正整数(`0`将报错),如果该参数大于当前版本,会触发数据库升级。第二个参数可省略,如果数据库已存在,将打开当前版本的数据库;如果数据库不存在,将创建该版本的数据库,默认版本为`1`。 打开数据库是异步操作,通过各种事件通知客户端。下面是有可能触发的4种事件。 * **success**:打开成功。 * **error**:打开失败。 * **upgradeneeded**:第一次打开该数据库,或者数据库版本发生变化。 * **blocked**:上一次的数据库连接还未关闭。 第一次打开数据库时,会先触发`upgradeneeded`事件,然后触发`success`事件。 根据不同的需要,对上面4种事件监听函数。 ~~~ var openRequest = indexedDB.open('test', 1); var db; openRequest.onupgradeneeded = function (e) { console.log('Upgrading...'); } openRequest.onsuccess = function (e) { console.log('Success!'); db = openRequest.result; } openRequest.onerror = function (e) { console.log('Error'); console.log(e); } ~~~ 上面代码有两个地方需要注意。首先,`open()`方法返回的是一个对象(IDBOpenDBRequest),监听函数就定义在这个对象上面。其次,`success`事件发生后,从`openRequest.result`属性可以拿到已经打开的`IndexedDB`数据库对象。 ## 二、indexedDB.deleteDatabase() `indexedDB.deleteDatabase()`方法用于删除一个数据库,参数为数据库的名字。它会立刻返回一个`IDBOpenDBRequest`对象,然后对数据库执行异步删除。删除操作的结果会通过事件通知,`IDBOpenDBRequest`对象可以监听以下事件。 * `success`:删除成功 * `error`:删除报错 ~~~ var deleteRequest = window.indexedDB.deleteDatabase('demo'); deleteRequest.onerror = function (event) { console.log('Error'); }; deleteRequest.onsuccess = function (event) { console.log('success'); }; ~~~ 调用`deleteDatabase()`方法以后,当前数据库的其他已经打开的连接都会接收到`versionchange`事件。 > 注意,删除不存在的数据库并不会报错。 ## 三、indexedDB.cmp() `indexedDB.cmp()`方法比较两个值是否为 indexedDB 的相同的主键。它返回一个整数,表示比较的结果:`0`表示相同,`1`表示第一个主键大于第二个主键,`-1`表示第一个主键小于第二个主键。 ~~~ window.indexedDB.cmp(1, 2) // -1 ~~~ 注意,这个方法不能用来比较任意的 JavaScript 值。如果参数是布尔值或对象,它会报错。 ~~~ window.indexedDB.cmp(1, true) // 报错 window.indexedDB.cmp({}, {}) // 报错 ~~~