indexedDB---掌握浏览器内建数据库的基本用法

news2024/11/24 3:16:45

1.认识indexedDB

        IndexedDB 是一个浏览器内建的数据库,它可以存放对象格式的数据,类似本地存储localstore,但是相比localStore 10MB的存储量,indexedDB可存储的数据量远超过这个数值,具体是多少呢?

默认情况下,浏览器会将自身所在的硬盘位置剩余容量全部作为indexedDB的存储容量,

这里差不多就对应这c盘的剩余容量,所以indexDB有第一个特点,容量大

存储的格式,以对象的键值形式存储数据,注意这里的 id 是一个唯一的索引属性,

在indexedDB中,需要有一个唯一的标识符来区分存储的内容,这里使用的是id,这表示,存储的每一个值内都需要一个唯一的id值,这是第二个特点,统一的唯一标识符(key)

最后它采用的是,对象存储库和存储表的数据存放方式;你可以理解成,indexedDB是一个大的数据对象(object),它内部包含了很多数据库(object),每个数据库内又有很多存储对象表(array),每个表内又有很多键值对(object),

在indexedDB中,有很多上面的这种存储库对象,可以看出这是一个树形结构,根节点就是indexedDB

所以,总结一下,indexedDB:

  1. 容量大
  2. 有唯一标识符(key)
  3. 树形结构的对象存储
  4. 和localStore一样同一个域名下的indexedDB是一致的,否则不一致,每个网页都有各自的indexedDB(补充)

2.indexedDB数据库的使用

查看indexedDB

我们可以在开发者工具中直接查看indexedDB数据库,也可以在控制台打印出来,indexedDB是window对象下的一个属性,

// 浏览器本地数据库
console.log(indexedDB);// window.indexedDB

打开数据库

const request = indexedDB.open(name, version);

name —— 字符串,即数据库名称。
version —— 一个正整数版本,默认为 1。

返回 openRequest 对象

注意:数据库的相关操作都是异步的,打开、读取和编辑、删除,都需要时间处理,并不是马上执行结束,所以每一个对数据库的相关操作都有回调事件进行监听,

  • success:打开成功,数据库准备就绪 ,request.result 中有了一个数据库对象“Database Object”,这就是一个数据库,我们可以通过它访问这个库的所有数据
  • error:打开失败。
  • upgradeneeded:更新版本,当数据库的版本更新时触发,例如,1->2。

        这里解释一下版本号,一个 数据库在打开时,若没有这个库,则会新建,默认版本号为1;若有,打开时的版本号比原本保存的版本号更高,则会更新这个库,同时触发upgradeneeded事件,一个数据库的版本号只会越来越高,不会出现还原旧版本的情况,这是因为有些特定的操作只能在版本更新时执行(upgradeneeded事件)--- 例如,新建、编辑、删除一个对象存储表

// 浏览器本地数据库
console.log(indexedDB);// window.indexedDB

// 打开数据库
const request = indexedDB.open('myDatabase', 1);

request.onerror = function(event) {
  console.error('数据库打开报错');
}

request.onupgradeneeded = function(event) {
  const db = event.target.result;
  console.log('数据库需要升级');
  // 创建一个对象存储空间
}

request.onsuccess = function(event) {
  const db = event.target.result;
  console.log('数据库打开成功');
}

 

新建了一个myDatabase数据库,触发 了一次版本更新,在次执行时版本还是1就不会触发更新升级的事件,

这样就成功新建、打开了一个数据库,

新建一个对象存储表

db.createObjectStore(name[, keyOptions]);

name 是存储区名称,例如 "books" 表示书。
keyOptions 是具有以下两个属性之一的可选对象:
    keyPath —— 对象属性的路径,IndexedDB 将以此路径作为键,例如 id。
    autoIncrement —— 如果为 true,则自动生成新存储的对象的键,键是一个不断递增的数字。
  •  name:储存表的名称
  • keyOptions: 配置对象,
    • keyPath: 储存数据的标识符
    • autoIncrement:默认为false,若为true,则会自动在储存的对象上添加标识符属性,并附上一个自增的正数值(1,2,3,4......)

要操作对象存储表就需要更新版本号,这个createObjectStore方法只能在更新事件内使用,否则将产生错误

// 打开数据库
const request = indexedDB.open('myDatabase', 2);

request.onupgradeneeded = function(event) {
  const db = event.target.result;
  console.log('数据库需要升级');
  // 创建一个对象存储空间
  
  db.createObjectStore('imgStore', { keyPath: 'id', autoIncrement: true });
  console.log('对象存储表创建成功');
}

request.onsuccess = function(event) {
  const db = event.target.result;
  console.log('数据库打开成功');
}

注意需要增加版本号,否则不触发更新事件,这里新建了一个叫imgStore的对象存储表

添加和读取数据

添加和读取数据都在onsuccess的回调中执行,不需要更新版本,

添加数据add()---参数any

request.onsuccess = function(event) {
  const db = event.target.result;
  console.log('数据库打开成功');
  // 连接数据库的表,比获取读写权限,默认只读
  const transaction = db.transaction(['imgStore'], 'readwrite');
  const objectStore = transaction.objectStore('imgStore');
  // 添加数据
  const re = objectStore.add({
    name: 'test',
    content:'测试数据'
  });
  re.onsuccess = function (event) {
    console.log('文件添加成功');
  }
}

transaction是一个事务,连接了imgStore,并开放读写权限,之后再通过事务,获取imgStore对象存储表,最后再执行add添加数据,这里添加了一个测试对象,同样添加时一个异步操作,需要回调等待结果,

这里成功添加后可以查看数据表中的内容,如果内容没有出现可以 点击刷新,看到结果后可以发现,多了一个属性id,这个就是存储对象的标识符,前面设置了自动添加,若没有设置自动添加,则需要手动的添加一个id属性,且id的值不能和其他数据相同,否则都会添加失败

读取数据get()---参数标识符的值

request.onsuccess = function(event) {
  const db = event.target.result;
  console.log('数据库打开成功');
  // 连接数据库的表,比获取读写权限,默认只读
  const transaction = db.transaction(['imgStore'], 'readwrite');
  const objectStore = transaction.objectStore('imgStore');
  // // 添加数据
  // const re = objectStore.add({
  //   name: 'test',
  //   content:'测试数据'
  // });
  // re.onsuccess = function (event) {
  //   console.log('文件添加成功');
  // }
  // 读取数据
  const re2 = objectStore.get(1);
  re2.onsuccess = function (event) {
    console.log(re2.result);
  }
}

可以看到成功读取到了id为1的数据,

示例:存储一张图片

了解了添加和读取数据,那我们可以来实现上传一张图片,保存再数据库中,

思路:通过input file 上传一个图片,再将其存为blob,再将blob转成base64存储起来

(有关blob的操作可以参考:js二进制数据,文件---blob对象_js 输出 blob-CSDN博客)

let addFile;

request.onsuccess = function (event) {
  const db = event.target.result;
  console.log('数据库打开成功');

  addFile = function (file) {
    // 连接数据库的表,比获取读写权限,默认只读
    const transaction = db.transaction(['imgStore'], 'readwrite');
    const objectStore = transaction.objectStore('imgStore');
    const re = objectStore.add(file)
    re.onsuccess = function (event) {
      console.log('文件添加成功');
    }
  }
}

const file = document.getElementById('file');
file.addEventListener('change', (event) => {
  const file = event.target.files[0];
  if (file.type == 'image/jpeg') { // 如果文件是图片
    let blob = new Blob([file], { type: 'image/jpeg' });
    let reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onload = function (event) {
      let base64 = event.target.result;
      console.log(base64);
      addFile({
        name: file.name,
        data: base64
      })
    }
  }
})

这样我们就成功存放了一个base64形式的图片文件,

然后我们可以读取出这个图片,渲染再页面上


request.onsuccess = function (event) {
  const db = event.target.result;
  console.log('数据库打开成功');

  let getFile = function(){
    // 连接数据库的表
    const transaction = db.transaction(['imgStore'], 'readonly');
    const objectStore = transaction.objectStore('imgStore');
    // 获取数据
    const re = objectStore.get(1);
    re.onsuccess = function (event) {
      console.log(re.result);
      let img = new Image();
      img.src = re.result.data;
      img.width=800;
      document.body.appendChild(img);
    }
  }
  getFile()
}

这样就成功拿到了图片,并且每次刷新后都会保留这个图片,就相当于一个能放大文件的localStore

完整代码展示

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>本地数据库</title>
</head>
<body>
    <input type="file" name="" id="file">
    
</body>
<script src="index.js"></script>
</html>

index.js 

// 浏览器本地数据库
console.log(indexedDB);// window.indexedDB
let addFile;//添加文件的方法
// 打开数据库
const request = indexedDB.open('myDatabase', 2);

request.onerror = function (event) {
  console.error('数据库打开报错');
}

request.onupgradeneeded = function (event) {
  const db = event.target.result;
  console.log('数据库需要升级');
  // 创建一个对象存储空间

  db.createObjectStore('imgStore', { keyPath: 'id', autoIncrement: true });
  console.log('对象存储表创建成功');
}

request.onsuccess = function (event) {
  const db = event.target.result;
  console.log('数据库打开成功');
  // // 连接数据库的表,获取读写权限,默认只读
  // const transaction = db.transaction(['imgStore'], 'readwrite');
  // const objectStore = transaction.objectStore('imgStore');
  // // 添加数据
  // const re = objectStore.add({
  //   name: 'test',
  //   content:'测试数据'
  // });
  // re.onsuccess = function (event) {
  //   console.log('文件添加成功');
  // }
  // 读取数据
  // const re2 = objectStore.get(1);
  // re2.onsuccess = function (event) {
  //   console.log(re2.result);
  // }

  addFile = function (file) {
    // 连接数据库的表,获取读写权限,默认只读
    const transaction = db.transaction(['imgStore'], 'readwrite');
    const objectStore = transaction.objectStore('imgStore');
    const re = objectStore.add(file)
    re.onsuccess = function (event) {
      console.log('文件添加成功');
    }
  }
  let getFile = function(){
    // 连接数据库的表
    const transaction = db.transaction(['imgStore'], 'readonly');
    const objectStore = transaction.objectStore('imgStore');
    // 获取数据
    const re = objectStore.get(1);
    re.onsuccess = function (event) {
      console.log(re.result);
      let img = new Image();
      img.src = re.result.data;
      img.width=800;
      document.body.appendChild(img);
    }
  }
  getFile()
}

const file = document.getElementById('file');
file.addEventListener('change', (event) => {
  const file = event.target.files[0];
  if (file.type == 'image/jpeg') { // 如果文件是图片
    let blob = new Blob([file], { type: 'image/jpeg' });
    let reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onload = function (event) {
      let base64 = event.target.result;
      console.log(base64);
      addFile({
        name: file.name,
        data: base64
      })
    }
  }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1849998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将WIN10的wifi上网分享给以太网接口

目录 打开网络设置设置属性点这里的设置将wlan主机的以太网接口IP设为自动获取 如果连接不成功&#xff0c;拔网线重连一次 打开网络设置 设置属性 点这里的设置 将wlan主机的以太网接口IP设为自动获取 如果连接不成功&#xff0c;拔网线重连一次

什么是N卡和A卡?有什么区别?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、什么是N卡和A卡&#xff1f;有什么区别&#xff1f;…

Desoutter智能拧紧中枢Connect过压维修

马头智能拧紧中枢过压维修是马头拧紧设备维护中的重要环节。当出现马头拧紧设备中枢过压现象时&#xff0c;会导致设备性能下降&#xff0c;甚至损坏设备&#xff0c;因此及时对过压中枢进行维修是保障设备正常运转的关键。 Desoutter电动螺丝刀控制器过压的原因可能有很多&am…

数学建模系列(3/4):典型建模方法

目录 引言 1. 回归分析 1.1 线性回归 基本概念 Matlab实现 1.2 多元回归 基本概念 Matlab实现 1.3 非线性回归 基本概念 Matlab实现 2. 时间序列分析 2.1 时间序列的基本概念 2.2 移动平均 基本概念 Matlab实现 2.3 指数平滑 基本概念 Matlab实现 2.4 ARIM…

HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

《计算机英语》测试练习题

作业3 一、单选题 内存条 的英文翻译是 A. memory chip (内存条通常指的是内存条上的存储芯片&#xff0c;但整个内存条的英文翻译应为 "RAM"&#xff0c;即 Random Access Memory 随机存取存储器) capacitor的中文意思是 D. 电容器 relay 的解释是 A. 继电器 por…

一、docker简介及卸载、安装

目录 一、Docker 简介 二、dockers三要素 1、Docker镜像&#xff08;image&#xff09; 2、Docker仓库 3、Docker容器 三、docker架构图 四. Docker 运行的基本流程 五、docker 卸载 1、停止docker服务 2、查看yum安装的docker文件包 3、查看docker相关的rpm源文件 …

ardupilot开发 --- Jetson Orin Nano 后篇

我拼命加速&#xff0c;但贫穷始终快我一步 0~1920. visp-d455&#xff1a;基于IBVS的Pixhawk无人机视觉伺服20.1 基础关于连接、通讯、UDP forward服务&#xff1a;一些相关的、有用的例程Linux C程序的gdb断点调试搭建仿真解决【testPixhawkDroneTakeoff.cpp例程能解锁但起飞…

优选免单模式:电商销售的新篇章

随着电商市场的日益繁荣&#xff0c;各种创新销售模式层出不穷。其中&#xff0c;优选免单模式以其独特的运作方式和激励机制&#xff0c;吸引了大量消费者的目光。该模式的核心在于通过降低商品售价、引入社交元素以及设计阶梯式奖励&#xff0c;激发消费者的购买热情&#xf…

[已解决]ImportError: DLL load failed while importing win32api: 找不到指定的程序。

使用pip install pywin32302安装后import找不到win32api 失败尝试 上网找别人的解决方案&#xff0c;大部分解决方案都是通过复制下面两个dll文件到 下面这个文件夹&#xff0c;并且复制到C:\Windows\System32&#xff0c;从而解决问题&#xff0c;但是我没能成功。 解决方…

Python编辑器pycharm详细安装步骤

PyCharm 的详细安装步骤 以下是在 Windows 系统上安装 PyCharm 的详细步骤&#xff1a; 第一步&#xff1a;下载安装程序 访问 PyCharm 官方网站&#xff08;https://www.jetbrains.com/pycharm/&#xff09;&#xff0c;根据自己的需求选择社区版&#xff08;Community&…

分享uniapp + Springboot3+vue3小程序项目实战

分享uniapp Springboot3vue3小程序项目实战 经过10天敲代码&#xff0c;终于从零到项目测试完成&#xff0c;一个前后端分离的小程序实战项目学习完毕 时间从6月12日 到6月22日&#xff0c;具有程序开发基础&#xff0c;第一次写uniapp,Springboot以前用过&#xff0c;VUE3也…

docker in docker 在CI中应用解析

docker in docker 简介 docker里嵌套运行docker&#xff0c;本文讲解其在jenkins和gitlab-runner 种的调用流程 一、用于jenkins 容器化部署jenkins时调用docker命令集成CI功能 [rootops-demo~]# docker inspect jenkins --format"{{json .Mounts}}" [{"T…

电脑文件夹怎么加密?文件夹加密的5种方法

在数字化时代&#xff0c;信息安全显得尤为重要。对于个人电脑用户来说&#xff0c;文件夹加密是一种有效保护隐私和数据安全的方法。本文将介绍五种文件夹加密的方法&#xff0c;帮助您更好地保护自己的重要文件。 如何设置文件夹密码方法一&#xff1a;利用Windows系统自带的…

docker 基本用法及跨平台使用

一、Docker的优点 docker 主要解决的问题就是程序开发过程中编译和部署中遇到的环境配置的问题。 1.1 Docker与其他虚拟机层次结构的区别** 运行程序重点关注点在于环境。 VM虚拟机是基于Hypervisor虚拟化服务运行的。 Docker是基于内核的虚拟化技术实现的。 1.2 Docker的技…

深入分析并可视化城市轨道数据

介绍 中国城市化进程加速中&#xff0c;城市轨道交通的迅速扩张成为提升城市运行效率和居民生活品质的关键。这一网络从少数大城市延伸至众多大中型城市&#xff0c;映射了经济飞跃和城市管理现代化。深入分析并可视化城市轨道数据&#xff0c;对于揭示网络特性、评估效率、理…

计算机组成原理 | 数据的表示、运算和校验(3)数据处理与存储

移位 舍入和扩展 存储模式和对齐 不按边界对齐&#xff0c;访存次数会增加一次

大型语言模型在AMD GPU上的推理优化

Large language model inference optimizations on AMD GPUs — ROCm Blogs 大型语言模型&#xff08;LLMs&#xff09;已经改变了自然语言处理和理解&#xff0c;促进了在多个领域中的众多人工智能应用。LLMs在包括AI助手、聊天机器人、编程、游戏、学习、搜索和推荐系统在内的…

8个腾讯,18个阿里,104个百度

8个腾讯、18个阿里巴巴、104个百度!英伟达市值已经超越我的前司微软&#xff0c;成为全球第一&#xff0c;&#xff08;虽然今天又被微软超越&#xff0c;但势头非常猛&#xff09;达到了恐怖的3.34万亿美元&#xff01;这是什么概念&#xff1f;相当于8个腾讯&#xff0c;18个…

ARM阻击高通:AI PC大战与芯片之争

引言 在AI PC领域&#xff0c;高通的X Elite芯片因为其高性能和低功耗&#xff0c;一度被认为是未来的主导者。然而&#xff0c;ARM公司却通过法律手段试图阻止高通的独大&#xff0c;这不仅可能拖慢AI PC的发展进程&#xff0c;还引发了业界的广泛关注。本文将深入探讨ARM和高…