indexeddb全方位详解

indexed是indexeddb的缩写,是一款用来在浏览器端实现本地数据库操作的JavaScript API。它采用了对象仓库(Object Store)存储数据,通过key-value的方式进行数据的增删改查操作,并且与Web Worker结合可以高效的处理大量数据操作。

一、indexeddb介绍

1、indexeddb的概念

IndexedDB是HTML5新提供的浏览器端存储数据的一种方案,推出的初衷是为了支持在Web端应用中离线存储方案的开发。IndexedDB支持在客户端本地离线存储数据,提供下一级缓存,并不依赖于网络连接。

2、indexeddb的特点

IndexedDB擅长处理大量的客户端数据,定义了一个对象仓库,其中包含了可以使用键值对存储的对象。IndexedDB也支持存储其他类型的数据,如BLOB和ArrayBuffer。

3、indexeddb的优势

相对于localStorage和sessionStorage,IndexedDB比较优势比较明显:

  • 支持存储非字符串类型数据:localStorage和sessionStorage只支持存储字符串类型数据,而IndexedDB可以存储各种类型的数据,通过Blob对象可以存储二进制数据,通过ArrayBuffer对象可以存储大文件。
  • 支持创建多个对象仓库:每个对象库相当于一张表,我们可以使用不同的数据结构来存储不同类型的数据。
  • 支持异步操作:IndexedDB以异步的方式读取和存储数据,可以在读取和写入大段数据时提高性能。
  • 支持事务处理:IndexedDB支持通过事务处理选项来确保数据的完整性,以及避免在并发操作时对数据产生冲突。

因此,IndexedDB适用于那些需要大量读写本地数据资源的Web应用,比如:邮件客户端、CRM系统、日记、聊天等。

二、indexeddb入门

1、创建indexeddb数据库

    let db;
    let request = window.indexedDB.open("myDatabase", 1);

    request.onerror = function(event) {
        console.log("数据库打开报错");
    };
    request.onsuccess = function(event) {
        db = request.result;
        console.log("数据库打开成功");
    };
    request.onupgradeneeded = function(event) {
        db = event.target.result
        var objectStore = db.createObjectStore("customers", { keyPath: "id" });
        objectStore.createIndex("name", "name", { unique: false });
        objectStore.createIndex("email", "email", { unique: true });
    };
    

打开和创建数据库的过程是异步执行的。开发者需要在open方法的onsuccess函数处理异步回调函数时获取db对象。

2、向indexeddb数据库中存储数据

    let tx = db.transaction(["customers"], "readwrite");
    let objectStore = tx.objectStore("customers");
    let request = objectStore.add({ id: 1, name: "John", email: "john@doe.com" });
    request.onerror = function(event) {
        console.log("添加数据失败");
    };
    request.onsuccess = function(event) {
        console.log("添加数据成功");
    };
    tx.oncomplete = function() {
        console.log("事务完成");
    };
    

在indexeddb中添加和修改数据的逻辑都是一样的。首先需要开启一个事务,然后新建或者获取已经创建好的object store,最后再向object store中添加数据。

三、indexed注解

1、indexeddb的概念

indexed属性的特殊含义是将指定的字段进行索引,建立索引后可以通过索引快速进行数据查找,通过索引的方式可以提高数据查询的效率。

    let tx = db.transaction(["customers"], "readonly");
    let objectStore = tx.objectStore("customers");
    let index = objectStore.index("name");
    let request = index.get("John");
    request.onerror = function(event) {
        console.log("获取数据失败");
    };
    request.onsuccess = function(event) {
        console.log("获取John的信息:" + request.result.email);
    };
    

在indexeddb中通过index(索引)对象可以进行类似sql中where关键字的匹配操作。

2、indexeddb可以删掉吗

可以使用indexedDB.deleteDatabase()方法删除indexedDB数据库,一旦被删除就无法恢复。

    let req = indexedDB.deleteDatabase('mycoolnewdatabase');
    req.onsuccess = function () { console.log("Delete successfully");};
    req.onerror = function () { console.log("Delete unsuccessful");};
    

四、indexedDB使用

1、使用事务

需要使用IndexedDB执行数据读写操作时,建议将操作写成一个事务,以保证数据的完整性和一致性。通常一个事务中会包含多个操作,事务的目的是确保相关操作的原子性,也就是说:事务中的一系列操作要么全部成功,要么全部失败。

    let tx = db.transaction(["customers"], "readwrite");
    let objectStore = tx.objectStore("customers");
    objectStore.put({ id: 1, name: "John", email: "john@doe.com" });
    objectStore.put({ id: 2, name: "Bob", email: "bob@doe.com" });
    objectStore.put({ id: 3, name: "Tom", email: "tom@doe.com" });
    tx.oncomplete = function(event) {
        console.log("事务完成");
    };
    

2、使用游标

使用游标可以通过一组条件搜索已存储的记录,并按照指定的顺序返回这些记录。cursor方法将返回包含已索引数据库对象中一个表格中所有先前添加的对象;当你使用它时,你需要通过检查每个对象检查检索的数据是否与您的期望匹配,只有当它们匹配时才执行您的代码。

    let tx = db.transaction(["customers"], "readonly");
    let store = tx.objectStore("customers");
    let index = store.index('name');
    index.openCursor().onsuccess = function(event) {
        let cursor = event.target.result;
        if (cursor) {
            console.log(cursor.value.name);
            cursor.continue();
        }
    };
    

五、indexed by

1、indexed by的概念

indexed by是基于indexeddb进行一些restapi的封装,实现简单易用、高效便捷的本地存储方案。

2、indexed by的使用

    const client = new IndexedBy({
        dbName: 'database_name',
        objectStores: [{
            name: 'object_store_name',
            keyPath: 'id'
        }]
    });

    client.init().then(() => {
        client.actions.Insert('object_store_name', {
            id: 1,
            name: '可乐',
            number: 10
        });
    });
    

使用indexedby可以大大简化indexeddb的API使用难度。

六、indexed模式

1、indexed模式的概念

indexed模式是让indexeddb在有必要时自动升级数据库模型,让存储的数据更有条理。例如,当现有的“顾客”存储库缺少邮政编码一列时,indexedDB将自动更新数据库。

    let db;
    let request = indexedDB.open("myDatabase", 2);
    request.onupgradeneeded = function(event) {
      let db = event.target.result;
      let objectStore = db.createObjectStore("customers", { keyPath: "id" });
      objectStore.createIndex("name", "name", { unique: false });
      objectStore.createIndex("email", "email", { unique: true });
      objectStore.createIndex("zipcode", "zipcode", { unique: false });
    };
    request.onsuccess = function(event) {
      db = event.target.result;
    };
    

七、indexed by什么意思

indexed by什么意思

indexedby是一种全新的IndexedDB库,为IndexedDB提供了更面向对象的访问方式。它通过简单的链式调用和类似mongoose的模式来增强IndexedDB。

由此可见,”indexed by”就是把IndexedDB封装成了一个库,面向对象化和链式调用是它的特色。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/249267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-12 13:32
下一篇 2024-12-12 13:32

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25

发表回复

登录后才能评论