indexedDB初使用与感受

供稿:hz-xin.com     日期:2025-01-19
初次接触 indexedDB,之前的操作主要依赖 localStorage、sessionStorage 或 cookie。对于 indexedDB,我原先并不熟悉。本文旨在介绍如何封装一个函数,以简化与 indexedDB 的交互,提高代码的可读性和复用性。

假设我们希望实现一个函数,该函数接收数据库名称、表名称以及版本号作为参数,并返回一系列方法,用于执行增删改查等操作。实现的思路是通过封装 `initIndexDB` 函数来完成这一目标。

在操作 indexedDB 时,主要步骤包括:

1. 打开数据库仓库,若不存在则创建。使用 `window.indexedDB.open(dbName, version)` 实现。

2. 监听仓库实例的 `success`、`error` 和 `upgradeneeded` 事件。暂时不关注 `error` 事件,因为我们的实现中不考虑错误处理。

在创建数据库时,会触发 `upgradeneeded` 事件。然而,在已存在的数据库上打开仓库时,`upgradeneeded` 事件并不会被触发,这是一个需要注意的点。

3. 在 `upgradeneeded` 事件中,创建表及其关联的键和可索引字段。

4. `success` 事件中,全局保存数据库实例,以供后续操作使用。

5. 增删改查操作需要通过 `transaction` 方法进行。当创建数据库时,`transaction` 会在 `upgradeneeded` 中获取;若打开数据库,则需从 `success` 事件中获取。这意味着在不同场景下,我们需要区分获取 `transaction` 的方式。

实际上,封装函数的核心逻辑在于获取 `transaction` 对象。对于创建数据库的情况,通过 `upgradeneeded` 事件获取;对于打开数据库的情况,则在 `success` 事件中获取。这样一来,整个实现过程变得较为清晰。

在后续的增删改查操作中,使用 `transaction.objectStore(tableName)` 获取表实例后,便可以调用对应的 API 进行操作。

针对上述实现过程中涉及到的类型问题,例如监听事件对象的类型,由于事件对象的具体类型并不直接提供 `result` 属性,使用默认的 `Event` 类型并采用 `any` 类型来避免 ESLint 报错,是一种简便的解决方案。

对于实现中的细节和技术难点,欢迎各位开发者在评论区分享补充。

indexedDB初使用与感受
1. 打开数据库仓库,若不存在则创建。使用 `window.indexedDB.open(dbName, version)` 实现。2. 监听仓库实例的 `success`、`error` 和 `upgradeneeded` 事件。暂时不关注 `error` 事件,因为我们的实现中不考虑错误处理。在创建数据库时,会触发 `upgradeneeded` 事件。然而,在已存在的数据库上打...

Osx10103怎么样Osx10103正式版测评
SPDY、IndexedDB、JavaScript Promises 等众多新特性。新标准的加入,大大降低了 Safari 产生的功耗,官方表示可以让同一台 MacBook Air 通过 Safari 播放 Netflix 的 1080P 高清流媒体视频节省 2 小时的电力!

Osx 10.10.3怎么样
SPDY、IndexedDB、JavaScript Promises 等众多新特性。新标准的加入,大大降低了 Safari 产生的功耗,官方表示可以让同一台 MacBook Air 通过 Safari 播放 Netflix 的 1080P 高清流媒体视频节省 2 小时的电力!

OS X 10.10.3怎么样 OS X10.10.3正式版测评
SPDY、IndexedDB、JavaScript Promises 等众多新特性。新标准的加入,大大降低了 Safari 产生的功耗,官方表示可以让同一台 MacBook Air 通过 Safari 播放 Netflix 的 1080P 高清流媒体视频节省 2 小时的电力!