热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新建indexedDB数据库并插入数据

一、什么叫数据库DB的全名是database,即数据库。二、数据库的种类数据库有两种类型,分别是关系型数据库和非关系型数据库。关系型数据库:Oracle、DB2、Microsoft

一、什么叫数据库

DB的全名是database,即数据库。


二、数据库的种类

数据库有两种类型,分别是关系型数据库和非关系型数据库。



  • 关系型数据库:OracleDB2MicrosoftSQLServer、MicrosoftAccess、MySQL等。

  • 非关系型数据库:NoSql、Cloudant、MongoDb、redis、HBase等。

关系型数据库的优点:



  1. 能够复杂查询:可以用SQL句子便捷的在一个表及多个表之间做复杂的数据查询。

  2. 事务支持性优秀:能够实现对于安全性要求很高的数据访问。

非关系型数据库的优点:



  1. 性能好:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,并且不用通过SQL层的解析,因此性能表现优异。

  2. 可扩展性好:同样也是基于键值对,数据间耦合度低,因此很容易水平扩展。



  • SQL (Structured Query Language) 是一种数据库语言 。

  • 就数据库类型而言,IndexedDB 不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。




IndexedDB 具有以下特点

(1)键值对储存。 IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 Javascript 对象。对象仓库中,数据以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。

(2)异步。 IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。

(3)支持事务。 IndexedDB 支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。

(4)同源限制 IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。

(5)储存空间大 IndexedDB 的储存空间比 LocalStorage 大得多,一般来说不少于 250MB,甚至没有上限。

(6)支持二进制储存。 IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。



  • 数据库是一系列相关数据的容器。

  • 每个数据库包含若干个对象仓库(object store)。它类似于关系型数据库的表格。

  • 对象仓库保存的是数据记录。每条记录类似于关系型数据库的行,但是只有主键和数据体两部分。

  • 数据哭 > 对象仓库 > 数据记录


操作流程




  1. 打开数据库:  indexedDB.open()

    var version = 1;
    var databaseName = "database";
    var request = window.indexedDB.open(databaseName, version);//这是一个异步操作,但是会立刻返回一个IDBOpenDBRequest对象。方法返回一个IDBRequest对象。这个对象通过三种事件error、success、upgradeneeded处理打开数据库的操作结果。
    var db;
    /**
    * 新建数据库与打开数据库是同一个操作。
    * 如果要打开的数据库不存在,则会先新建数据库:
    * 1. 新建数据库时调用 request.onupgradeneeded(因为这时版本从无到有,所以会触发这个事件)
    * 2. 把数据库版本设为 1
    * 3. 此时数据库对象 db = e.target.result;
    * 新建数据库后,就可以打开数据库了,所以继续调用 request.onsuccess
    * */
    request.Onupgradeneeded= function(e) {
    db = e.target.result;
    console.log("onupgrageneeded");
    // 通常新建数据库以后,第一件事是新建对象仓库(即新建表),并设置主键
    var objectStore = db.createObjectStore("person", {
    keyPath: "id" //设置主键为 id
    });
    }
    /**
    * 如果要打开的数据库存在,则会直接打开该数据库
    * 此时数据库对象 db = request.result;
    * */
    request.Onsuccess= function(e) {
    db = request.result;
    console.log("success");
    }
    /**
    * 数据库打开错误时调用此回调函数
    * */
    request.Onerror= function(e) {
    console.log("error");
    }




  2. 新建数据库:


    新建数据库与打开数据库是同一个操作。如果指定的数据库不存在,就会新建。
    a. 新建对象仓库(即新建表)。

    request.Onupgradeneeded= function(e) {
    db = e.target.result;
    console.log("onupgrageneeded");
    // 通常,新建数据库以后,第一件事是新建对象仓库(即新建表),并设置主键
    var objectStore = db.createObjectStore("person", {
    keyPath: "id" //设置主键为 id
    });
    }
    b. 更好的写法是先判断一下,这张表格是否存在,如果不存在再新建。

    request.Onupgradeneeded= function(e) {
    db = e.target.result;
    console.log("onupgrageneeded");
    // 通常新建数据库以后,第一件事是新建对象仓库(即新建表),并设置主键
    var objectStore;
    if(!db.objectStoreNames.contains(databaseName)) {//如果这个 对象仓库/表 不存在,就新建
    objectStore = db.createObjectStore("person", {
    keyPath: "id" //设置主键为 id
    });
    }
    }
    c. 如果数据记录里面没有合适作为主键的属性,可以让 IndexedDB 自动生成主键。

    var objectStore = db.createObjectStore("person", { autoIncrement: true }); //指定主键为一个递增的整数



  3. 新增数据:


    新增数据指的是向对象仓库写入数据记录。这需要通过事务完成。

    var obj1 = {id:1,name:"张三",age:24,email:"zhangsan@foxmail.com"};
    var obj2 = {id:2,name:"李四",age:30,email:"lisi@foxmail.com"};
    function addRecord(obj){
    var request = db.transaction(["person"],"readwrite") //写入数据需要新建一个事务。新建时必须指定表格名称和操作模式(“只读”或“读写”)
    .objectStore("person") //新建事务以后,通过IDBTransaction.objectStore(name)方法,拿到 IDBObjectStore 对象
    .add(obj); //再通过表格对象的add()方法,向表格写入一条记录
    request.Onsuccess= function(e){
    console.log("数据写入成功");
    }
    request.Onerror= function(e){
    console.log("数据写入失败");
    }
    }
    window.Onload= function(){
    addRecord(obj1);
    addRecord(obj2);
    }

    注意:不加window.onload 可能存在异步问题,报undefined错误。

    执行过代码后如果对象仓库仍是空,刷新一下即可:

     




参考文章:

[1] https://www.shulanxt.com/doc/dbdoc/db-intro

[2] http://www.ruanyifeng.com/blog/2018/07/indexeddb.html

[3] https://wangdoc.com/Javascript/bom/indexeddb.html

[4] https://www.bilibili.com/video/BV15J411H7GH



推荐阅读
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 为何Serverless将成为未来十年的主导技术领域?
    为何Serverless将成为未来十年的主导技术领域? ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • Redis 主从复制机制详解及其工作原理
    主从复制机制在 Redis 中具有重要作用,能够实现读写分离、提升系统性能并提供快速的灾难恢复能力。具体实现方面,以一主两从的架构为例,需要创建三个独立的配置文件(.conf),分别用于主节点和两个从节点的设置。通过这种方式,可以从主节点同步数据到从节点,确保数据的一致性和高可用性。此外,还可以利用从节点进行读操作,减轻主节点的压力,进一步提高系统的整体性能。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有