You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮将字符串存入IndexedDB的实现及问题排查

点击按钮存储字符串到IndexedDB实现方案

原有代码问题说明

你之前功能无法生效的核心原因是错误将数据存储逻辑放在了onupgradeneeded回调中:

onupgradeneeded 事件仅会在数据库首次创建、传入的数据库版本号高于本地已存版本时触发,仅适合用来初始化对象存储、索引等数据库结构,日常的增删改查业务逻辑不能写在这个回调里。

实现思路

  • 数据库连接成功后缓存实例,避免每次操作都重复发起开库请求
  • 单独封装数据写入方法,写入时主动开启读写事务完成数据提交
  • 页面加载完成后提前初始化数据库,按钮点击时直接调用写入方法存储目标字符串

完整可运行代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>IndexedDB存储示例</title>
</head>
<body>
  <button onclick="saveStringToDB('HelloWorld')">Store HelloWorld</button>

  <script>
    // 全局缓存数据库实例
    let dbInstance = null;
    // 数据库配置常量
    const DB_CONFIG = {
      name: 'demoDB',
      version: 1,
      storeName: 'wdesk'
    };

    // 初始化数据库
    function initDB() {
      const openRequest = indexedDB.open(DB_CONFIG.name, DB_CONFIG.version);

      // 仅在版本升级/首次创建时执行结构初始化
      openRequest.onupgradeneeded = (e) => {
        const db = e.target.result;
        if (!db.objectStoreNames.contains(DB_CONFIG.storeName)) {
          // 创建对象存储,设置自增主键
          db.createObjectStore(DB_CONFIG.storeName, { 
            keyPath: 'id', 
            autoIncrement: true 
          });
        }
        console.log('数据库结构初始化完成');
      };

      openRequest.onsuccess = (e) => {
        dbInstance = e.target.result;
        console.log('数据库连接成功');
        // 全局监听数据库操作错误
        dbInstance.onerror = (err) => console.error('数据库操作异常:', err);
      };

      openRequest.onerror = (e) => console.error('数据库打开失败:', e.target.error);
    }

    // 存储字符串到IndexedDB
    function saveStringToDB(targetStr) {
      if (!dbInstance) {
        alert('数据库尚未加载完成,请稍后重试');
        return;
      }
      // 开启读写事务
      const transaction = dbInstance.transaction(DB_CONFIG.storeName, 'readwrite');
      const store = transaction.objectStore(DB_CONFIG.storeName);
      // 提交写入请求,附带创建时间方便后续查询区分
      const saveRequest = store.add({
        content: targetStr,
        createTime: new Date().toLocaleString()
      });

      saveRequest.onsuccess = () => {
        console.log(`字符串「${targetStr}」存储成功,记录ID:${saveRequest.result}`);
        alert('存储成功!');
      };

      saveRequest.onerror = () => console.error('存储失败:', saveRequest.error);
    }

    // 页面加载完成后初始化数据库
    window.addEventListener('DOMContentLoaded', initDB);
  </script>
</body>
</html>

关键说明

  • 上述代码默认用自增数字作为主键,存储的内容会带上创建时间;如果需要直接存纯字符串,可以修改对象存储创建逻辑,去掉keyPath配置,写入时传入自定义key即可,例如store.add(targetStr, 'my_custom_key')
  • add方法遇到同key数据会报错,put方法遇到同key数据会覆盖,可根据业务场景选择
  • IndexedDB所有操作都是异步执行,需要在对应成功/失败回调中处理后续逻辑,不能用同步写法等待结果

内容的提问来源于stack exchange,提问作者user18889997

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:06:25