找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

152

积分

0

好友

20

主题
发表于 14 小时前 | 查看: 1| 回复: 0

localStorage 只能存储字符串类型的数据。如果需要存储对象等复杂数据类型,必须先用 JSON.stringify() 方法将其序列化为字符串,存储后再通过 JSON.parse() 解析还原。如果省略这些必要步骤,数据将无法正确存储或读取。

图片

与 localStorage 不同,IndexedDB 支持存储多种数据类型,包括基本类型(如 boolean、number、string 等)和复杂类型(如 object、array、blob 等)。存储时无需手动格式转换,直接操作即可。

图片

在 IndexedDB 中,数据存储的基本单位是对象仓库(object store)。每个浏览器源(origin)可以包含多个数据库,每个数据库可以拥有多个对象仓库,每个对象仓库则存储多条数据记录。

图片

使用 db.createObjectStore(name, options) 方法可以在数据库中创建对象仓库。其中,name 参数指定仓库名称,options 用于配置仓库属性,主要包括 keyPath(定义键名)和 autoIncrement(设置自动递增键值)。这两种配置的组合会产生四种不同的键类型。

图片

需要注意的是,对象仓库的创建或修改必须在 "upgradeneeded" 事件处理函数中进行,否则会抛出错误。

图片

图片

在 "upgradeneeded" 事件处理函数内创建对象仓库,可以避免此类错误。

图片

图片

为了构建灵活的数据库工具库,对象仓库的名称和配置应支持动态传入。因此,我们对 connect() 函数进行改造,允许用户传递仓库选项数组。

图片

createObjectStores() 函数负责具体的仓库创建逻辑,其实现如下:

图片

测试代码也相应调整,在连接数据库时传入对象仓库配置数组,根据需要创建多个仓库。

图片

然而,当前实现存在一个问题:在数据库版本升级时,没有检查仓库是否已存在,直接尝试创建可能导致重复仓库错误。

图片

为避免该问题,应在创建前使用 db.objectStoreNames.contains(name) 方法检查仓库名是否存在。db.objectStoreNames 是一个包含所有仓库名称的类数组对象。

改造后的对象仓库创建函数如下:

图片

经过优化,版本升级时将仅创建不存在的新仓库,避免重复创建错误。

同步更新测试代码:

图片

错误信息消失,新旧仓库均正常创建。

图片

图片

您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-1 15:06 , Processed in 1.190882 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表