indexedDB(一)简介以及创建

本文介绍IndexedDB,一种前端浏览器本地基于JavaScript的事务性数据库。详细解释其特性,包括存储量大、支持事务操作、异步API及丰富的数据类型。并提供了数据库创建、初始化的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

indexedDB
1.前端浏览器本地基于javascript的事务性数据库,相比其他的浏览器缓存LocalStorage 、cookie等相比,数据有以下特点

1.存储量大,理论上不封顶
2.同源策略是一样的
3.多数api采用的都是异步的方式,防止数据量大的时候阻塞其他的一些操作
4.通过对象仓库存储的方式
5.存储的类型比较丰富
6.能够为数据建立索引,提供查找性能

2.IndexedDB的特点

1.对象仓库,在indexedDB中是没有表的概念的,而是objectStore,一个数据库中可以包含多个objectStore,它是一个灵活的数据结构可以存放多种类型数据,里面储存的每条数据都和一个键相关联。键值可以指定也可以用数字递增也可以不指定但存储的类型会有差异。

2.事务性, 每次操作数据库都必须创建一个事务,2个参数(表名,是否可读写) db.transaction(storeName, ‘readwrite’)

3.基于请求,异步,indexedDB打开数据库,新建表等都是基于请求的,是一种异步的处理方式,必须在他回调函数中处理

创建

1.判断兼容性

var indexedDB =window.indexedDB ||window.webkitIndexedDB ||window.mozIndexedDB || window.msIndexedDB;
if (!indexedDB) {
      console.log('你的浏览器不支持IndexedDB');
    }

2.打开数据库

注:db 是全局变量,这边用的是vue 放在了data中

// 2\. 通过IDBFactory接口的open方法打开一个indexedDB的数据库实例
    // 第一个参数: 数据库的名字,第二个参数:数据库的版本。返回值是一个:IDBRequest实例,此实例有onerror和onsuccess事件。
    var IDBOpenDBRequest = indexedDB.open('yjDB', 1);
    
// 打开数据库成功后,自动调用onsuccess事件回调。
    IDBOpenDBRequest.onsuccess = (e)=> {
      this.db=e.target.result;
      console.log('打开成功仓库yjDB',e.target.result);
    };

    // 打开数据库失败
    IDBOpenDBRequest.onerror = function(e) {
      console.log(e.currentTarget.error.message,"打开失败");
    };

3.数据库初始化

注:数据初始化回调函数 早于 创建的成功回调
下方是创建了2个objectStroe 里面分别是3个索引,keyPath是关联你所需要存的数据

// 第一次打开成功后或者版本有变化自动执行以下事件:一般用于初始化数据库。
    IDBOpenDBRequest.onupgradeneeded  = (e)=> {
      console.log("初始化或版本变动")
      this.db = e.target.result; // 获取到 demoDB对应的 IDBDatabase实例,也就是我们的数据库。
      // console.log('db');
      if (!this.db.objectStoreNames.contains('yyyyy')) {
        //如果表格不存在,创建一个新的表格(keyPath,主键 ; autoIncrement,是否自增),会返回一个对象(objectStore)
        // objectStore就相当于数据库中的一张表。IDBObjectStore类型。
        var objectStore = this.db.createObjectStore('yyyyy', {
          keyPath: 'id',
          // autoIncrement: true    //自动生成主键
        });


      //   //指定可以被索引的字段,unique字段是否唯一。类型: IDBIndex
        objectStore.createIndex('name', 'name', {
          unique: true  //是否唯一, 意思是name 都是唯一的不能重复
        });
        objectStore.createIndex('age', 'age', {
          unique: false
        });
        objectStore.createIndex('sex', 'sex', {
          unique: false
        });
        console.log('数据库版本更改为: ' + e.version,'仓库1');
      }

      if (!this.db.objectStoreNames.contains('two')) {
        //如果表格不存在,创建一个新的表格(keyPath,主键 ; autoIncrement,是否自增),会返回一个对象(objectStore)
        // objectStore就相当于数据库中的一张表。IDBObjectStore类型。
        var objectStore = this.db.createObjectStore('two', {
          keyPath: 'id',
          // autoIncrement: true    //自动生成主键
        });


      //   //指定可以被索引的字段,unique字段是否唯一。类型: IDBIndex
        objectStore.createIndex('name', 'name', {
          unique: true  //是否唯一
        });
        objectStore.createIndex('height', 'height', {
          unique: false
        });
        objectStore.createIndex('weight', 'weight', {
          unique: false
        });
        console.log('数据库版本更改为: ' +e.version ,'仓库2');
      }
      
    };

效果如下

在这里插入图片描述

下一篇 indexedDB(二)查询

### 使用 IndexedDB 创建数据库及其与 HTML 文件的关系 #### **IndexedDB 数据库的创建方法** IndexedDB种基于浏览器的 NoSQL 数据库存储技术,允许开发者在客户端存储大量结构化的数据。以下是关于如何使用 IndexedDB 在浏览器中创建数据库的具体说明: - **调用 `indexedDB.open()` 方法** 要创建或打开个数据库,可以使用 `indexedDB.open(databaseName, version)` 方法。此方法返回个请求对象 (`IDBOpenDBRequest`),用于监听事件以处理数据库的操作状态变化[^1]。 ```javascript const request = indexedDB.open("MyDatabase", 1); ``` - **定义升级逻辑** 当指定的版本号高于现有数据库的版本时,`onupgradeneeded` 事件会被触发。此时可以在回调函数中执行诸如创建对象仓库(object store)、设置索引等初始化操作[^4]。 ```javascript request.onupgradeneeded = function(event) { const db = event.target.result; const objectStore = db.createObjectStore("employees", { keyPath: "id", autoIncrement: true }); objectStore.createIndex("name", "name", { unique: false }); }; ``` - **捕获成功和错误事件** 成功建立连接后可通过 `onsuccess` 属性访问数据库实例;而遇到异常则需通过 `onerror` 来诊断问题所在[^3]。 ```javascript request.onsuccess = function(event) { const db = event.target.result; console.log("Database opened successfully."); }; request.onerror = function(event) { console.error("Error opening database:", event.target.error); }; ``` --- #### **IndexedDB 与 HTML 文件的关系** IndexedDB 并不是个直接嵌套于 HTML 文件内部的部分,而是作为浏览器环境的部分存在。这意味着: - **HTML 文件仅充当入口角色** HTML 文件本身并不包含任何实际的数据库内容。相反,它是用来加载 JavaScript 脚本的地方,这些脚本负责管理和操作 IndexedDB 实例[^1]。 - **动态交互依赖 JavaScript** 所有关于 IndexedDB 的操作——包括但不限于创建、读取、更新和删除记录——都需要由附加到 HTML 页面中的 JavaScript 完成。换句话说,HTML 只提供了个容器作用,真正的核心功能是由 JS 编写的逻辑驱动的[^2]。 - **跨页面共享能力受限** 尽管同域名下的所有窗口都可以访问同IndexedDB 数据库,但是这种关系仍然保持松散耦合的形式。即每个单独运行的 HTML 文件都必须重新声明必要的代码片段才能获得对该资源的有效控制权[^3]。 --- ### 总结 综上所述,虽然 HTML 文件提供了启动点的作用,但真正实现对 IndexedDB 数据库管理的任务却落在了 JavaScript 上面。通过合理运用相关 API 接口,不仅可以轻松完成基础架构搭建工作,还能进步挖掘更多高级特性的潜力,比如事务处理机制或是异步编程模式优化等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值