IndexedDB

news2024/11/28 6:27:29

IndexedDB

  • 操作流程
    • 打开数据库
    • 新建数据库
    • 新增数据
    • 读取数据
    • 遍历数据
    • 更新数据
    • 删除数据
    • 使用索引
    • 案例
  • indexedDB对象
    • indexedDB.open()

操作流程

打开数据库

使用IndexedDB 的第一步是打开数据库,使用indexedDB.open()方法

// 第一个参数是字符串,表示数据库的名字。如果指定的数据库不存在,就会新建数据库
// 第二个参数是整数,表示数据库的版本。如果省略,打开已有数据库时,默认为当前版本;新建数据库时,默认为1
var request = window.indexedDB.open(databaseName, version)

indexedDB.open() 方法返回一个IDBRequest对象。这个对象通过三个事件error、success、upgradeneeded,处理打开数据库的操作结果。

  1. error 事件
    error 事件表示打开数据库失败。
request.onerror = function (event) {
	console.log('数据库打开报错')
}
  1. success 事件
    success 事件表示成功打开数据库。
var db
request.onsuccess = function (event) {
	db = request.result
	console.log('数据库打开成功')
}
// 这时,通过request 对象的 result属性拿到数据库对象。
  1. upgradeneeded 事件
    如果指定的版本号,大于数据库的实际版本号,就会发生数据库升级事件 upgradeneeded。
var db
request.onupgradeneeded = function (event) {
	db = event.target.result
}
// 这时通过事件对象的 target.result 属性,拿到数据库实例

新建数据库

新建数据库与打开数据库是同一操作。如果指定的数据库不存在,就会新建。不同之处在于,后续的操作主要在 upgradeneeded 事件的监听函数里面完成,因为这时版本从无到有,所以会触发这个事件。
通常,新建数据库以后,第一件事是新建对象仓库(即新建表)。

// 数据库新建成功后,新增一张叫做person的表格,主键是id
request.onupgradeneeded = function (event) {
	db = event.target.result
	var objectStore = db.createObjectStore('person', { keyPath: 'id'})
}

// 更好的写法是先判断一下,这张表是否存在,如果不存在再新建。
request.onupgradeneeded = function (event) {
	db = event.target.result
	var objectStore
	if (!db.objectStoreNames.contains('person')) {
		objectStore = db.createObjectStore('person', {keyPath: 'id'})
	}
}

主键(key)是默认建立索引的属性。比如,数据记录是 { id: 1, name: '张三’ },那么id 属性可以作为主键。主键也可以指定为下一层对象的属性,比如{foo: {bar: ‘baz’}}的foo.bar也可以指定为主键。
如果数据记录里面没有合适作为主键的属性,那么可以让IndexedDB自动生成主键。

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

新建对象仓库以后,下一步可以新建索引。

request.onupgradeneeded = function (event) {
	db = event.target.result
	var objectStore = db.createObjectStore('person', { keyPath: 'id' })
	objectStore.createIndex('name', 'name', {unique:false})
	objectStore.createIndex('email', 'email', {unique:true})
}
// IDBObject.createIndex() 的三个参数分别为索引名称、索引所在的属性、配置对象(说明该属性是否包含重复的值)

新增数据

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

// 写入数据需要新建一个事务。新建时必须指定表格名称和操作模式(“只读”或“读写”)。新建事务以后,通过 IDBTransaction.objectStore(name) 方法,拿到IDBObjectStore 对象,再通过表格对象的add()方法,向表格写入一条记录
function add() {
	var request = db.transaction(['person'], 'readwrite')
		.objectStore('person')
		.add({id:1, name: '张三', age: 24, email: '11@qq.com'})
	request.onsuccess = function(event) {
		console.log('数据写入成功')
	}
	request.onerror = function(event) {
		console.log('数据写入失败')
	}
}
add()

读取数据

读取数据也是通过事务完成。

// objectStore.get() 方法用于读取数据,参数是主键的值。
function read() {
	var transaction = db.transaction(['person'])
	var objectStore = transaction.objectStore('person')
	var request = objectStore.get(1)
	request.onerror = function(event) {
		console.log('事务失败')
	}
	request.onsuccess = function(event) {
		if (request.result) {
			console.log('Name:'+request.result.name)
			console.log('Age'+request.result.age)
			console.log('Email'+request.result.email)
		} else {
			console.log('未获得数据记录')
		}
	}
}
read()

遍历数据

遍历数据表格的所有记录,要使用指针对象IDBCursor。

// 新建指针对象的 openCursor() 方法是一个异步操作,所以要监听success 事件
function readAll() {
	var objectStore = db.transaction('person').objectStore('person')
	objectStore.openCursor().onsuccess = function(event) {
		var cursor = event.target.result
		if (cursor) {
			console.log(`Id:${cursor.key}`)
			console.log(`Name${cursor.value.name}`)
			console.log(`Age${cursor.value.age}`)
			console.log(`Email${cursor.value.email}`)
			cursor.continue()
		} else {
			console.log('没有更多数据')
		}
	}
}
readAll()

更新数据

更新数据要使用 IDBObject.put() 方法。

// put() 方法自动更新了主键为1的记录
function update() {
	var request = db.transaction(['person'], 'readwrite')
		.objectStore('person')
		.put({ id: 1, name: '李四', age: 35, email: '11@qq.com' })
	request.onsuccess = function(event) {
		console.log('数据更新成功')
	}
	request.onerror = function(event) {
		console.log('数据更新失败')
	}
}
update()

删除数据

IDBObjectStore.delete() 方法用于删除记录。

function remove() {
	var request = db.transaction(['person'], 'readwrite')
		.objectStore('person')
		.delete(1)
	request.onsuccess = function(event) {
		console.log('数据删除成功')
	}
}

使用索引

索引的意义在于,可以让你搜索任意字段,也就是从任意字段拿到数据记录。
如果不建立索引,默认只能搜索主键(即从主键取值)。

// 假定新建表格的时候,对 name 字段建立了索引。
objectStore.createIndex('name', 'name', { unique: false })

然后从name找到对应的数据记录

var transaction = db.transaction(['person', 'readonly'])
var store = transaction.objectStore('person')
var index = store.index('name')
request.onsuccess = function(e) {
	var result = e.target.result
	if(result) {
		// ...
	} else {
		// ...
	}
}

案例

在这里插入图片描述
在这里插入图片描述

<template>
    <div style="font-size:18px">
        <el-button type="primary" @click="createdDB">新建</el-button>
        <el-button @click="add">新增</el-button>
        <el-button @click="read">读取</el-button>
        <el-button @click="readAll">遍历数据</el-button>
        <el-button @click="update">更新数据</el-button>
        <el-button @click="remove">删除数据</el-button>
    </div>
</template>
<script setup>
var request, db, db_table
function createdDB() {
    request = window.indexedDB.open('person', '1')
    request.onsuccess = function(res) {
        db = res.target.result
        console.log('成功', res)
    }
    request.onerror = function(error) {
        console.log('失败', error)
    }
    request.onupgradeneeded = function(event) {
        db = event.target.result
        var objectStore
        if (!db.objectStoreNames.contains('person')) {
            objectStore = db.createObjectStore('person',{keyPath: 'id'})
        }
        objectStore.createIndex('name', 'name', {unique: false})
        objectStore.createIndex('email', 'email', {unique: true})
    }
}
function add() {
    console.log(db)
    request = db.transaction(['person'], 'readwrite')
        .objectStore('person')
        .add({ id: 1, name: '张三', email: '11@qq.com' })
    request.onsuccess = function(event) {
        console.log('数据写入成功')
    }
    request.onerror = function(event) {
        console.log('数据写入失败')
    }
}
function read() {
    var transaction = db.transaction(['person'])
    var objectStore = transaction.objectStore('person')
    request = objectStore.get(1)
    request.onerror = function(event) {
        console.log('事务失败', event)
    }
    request.onsuccess = function(event) {
        if (request.result) {
            console.log(`name:${request.result.name}`)
            console.log(`email${request.result.email}`)
        } else {
            console.log('未获得数据记录')
        }
    }
}
function readAll() {
    var objectStore = db.transaction('person').objectStore('person')
    objectStore.openCursor().onsuccess = function(event) {
        var cursor = event.target.result
        if (cursor) {
            console.log(`id:${cursor.key}`)
            console.log(`name:${cursor.value.name}`)
            console.log(`email:${cursor.value.email}`)
            cursor.continue()
        } else {
            console.log('没有更多数据')
        }
    }
}
function update() {
    request = db.transaction(['person'], 'readwrite')
        .objectStore('person')
        .put({id: 1, name: 'haha', email: 'haha@qq.com'})
    request.onsuccess = function(event) {
        console.log('数据更新成功')
    }
    request.onerror = function(event) {
        console.log('数据更新失败')
    }
}
function remove() {
    request = db.transaction(['person'], 'readwrite')
        .objectStore('person')
        .delete(1)
    request.onsuccess = function(event) {
        console.log('数据删除成功')
    }
}
</script>

indexedDB对象

indexedDB.open()

indexedDB.open() 方法用于打开数据库。这是一个异步操作,但是会立刻返回一个IDBOpenDBRequest 对象。

var openRequest = window.indexedDB.open('test', 1)
// 打开一个名为test,版本为1的数据库。如果该数据库不存在,则会新建该数据库。

// open() 方法的
// 第一个参数是数据库名称,格式为字符串,不可省略;
// 第二参数是数据库版本,是一个大于0的正整数(0报错),如果该参数大于当前版本,会触发数据库升级。第二个参数可省略,如果数据已存在,将打开当前版本的数据库;如果数据库不存在,将创建版本的数据库,默认版本为1.

打开数据库是异步操作,通过各种事件通知客户端。四种事件:

  • success:打开成功
  • error:打开失败
  • upgradeneeded:第一次打开该数据库,或者数据库版本发生变化
  • blocked:上一次的数据库连接还未关闭
    第一次打开数据库时,会先触发 upgradeneeded 事件,然后触发 success 事件

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

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

相关文章

MyBatis注解开发

1 Mybatis注解开发单表操作 1.1 MyBatis的常用注解 Mybatis也可以使用注解开发方式&#xff0c;这样可以减少编写Mapper映射文件 Insert&#xff1a;实现新增 Update&#xff1a;实现更新 Delete&#xff1a;实现删除 Select&#xff1a;实现查询 Result&#xff1a;实现…

【MongoDB实战】数据备份与恢复(部分迁移)

场景&#xff1a; 需求&#xff1a; 解决方案&#xff1a; 步骤&#xff1a; Stage 1&#xff1a;【生产环境】修改备份文件映射 Stage 2&#xff1a;【生产环境】重新构建mongodb Stage 3&#xff1a;【客户环境】修改备份文件映射&#xff0c;同 Stage 1 Stage 4&…

FPGA+x86构建高性能国产网络测试仪竞技之道

众所周知&#xff0c;以太网已经深入我们的生活无处不在&#xff0c;企业、校园、大数据中心和家庭等都离不开网络&#xff0c;否则我们的生活将受到严重的影响。 以太网的接口速率也是迅速发展&#xff1a;10M、100M、GE、10GE、40GE、100GE&#xff0c;到目前逐步成熟的2.5G…

数据结构与算法——静态链表及其创建(C语言实现)

《顺序表和链表优缺点》里面&#xff0c;我们了解了两种存储结构各自的特点&#xff0c;那么&#xff0c;是否存在一种存储结构&#xff0c;可以融合顺序表和链表各自的优点&#xff0c;从而既能快速访问元素&#xff0c;又能快速增加或删除数据元素。 静态链表&#xff0c;也…

【雕爷学编程】Arduino动手做(22)——8X8 LED点阵MAX7219屏7

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#xff0c;这…

Java开发中使用sql简化开发

引语&#xff1a; 在Java开发中&#xff0c;我们更希望数据库能直接给我们必要的数据&#xff0c;然后在业务层面直接进行使用&#xff0c;所以写一个简单的sql语句有助于提高Java开发效率&#xff0c;本文由简单到复杂的小白吸收&#xff0c;还请多多指教。 使用MySQL数据库…

GO 语言GC

目录 写屏障 读屏障 GO语言GC准备 堆内存结构: GC内存分配: GC触发&#xff1a; P的作用: 写屏障 实现强弱三色不式,为了避免误删,则实现写屏障. 写屏障是在写操作中插入指令,目的是把数据对象的修改通知到GC GO语言支持两种写屏障 读屏障 非移动垃圾回收(例如 三色)天…

详解c++---智能指针

目录标题 为什么会有智能指针智能指针模拟实现库中的智能指针auto_ptrunique_ptrshared_ptr 智能指针的线程安全问题循环智能指针weak_ptr定制删除器定制删除器的实现 为什么会有智能指针 根据前面的知识我们知道使用异常可能会导致部分资源没有被正常释放&#xff0c;因为异常…

Jupyter入门使用教程

1 Jupyter Notebook与Jupyter Lab简介 Jupyter Notebook是一个开源的Web应用&#xff0c;在深度学习领域非常活跃。用户可以在这里创建和分享可执行代码、可视化结构和注释说明的文档。 Jupyter Notebook以网页的形式展现&#xff0c;用户可以在此网页中直接编辑代码、运行程…

语法怎么学 | 7-非谓语动词

为什么要学非谓语动词 太常见了&#xff0c;非谓语动词可以做句子中&#xff0c;除了谓语的任何成分 是一个非常重要课题&#xff0c;弄懂了这个&#xff0c;就相当于弄懂了语法的90%&#xff0c;特别是语法题 怎样学习 我在小破站上查了不少教程&#xff0c;大多数都很好&…

三种视频字幕提取工具让你更好地阅读和学习

视频字幕提取技术是指通过计算机算法自动从视频中提取出字幕文本的技术。这项技术能够大大提高视频的可用性&#xff0c;使得聋哑人士、语言学习者以及听力不佳的观众可以更好地理解视频内容。那么你知道视频字幕提取工具免费有哪些吗&#xff1f;接下来我将分享三款我亲测好用…

CSDN铁粉是什么?看完这篇你也可以获得忠实铁粉!(详细总结)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 什么是铁粉&#x1f3ac; 为什么存在铁粉⁉️ 为什么我的铁粉那么少 &#x1…

Spring【AOP】

AOP-面向切面编程 AOP&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 SpringAop中&#xff0c;通过Advice定义横切逻辑&#xff0c;并支持5种类型的Advice&#xff1a; 导入依赖 <dependency><groupId>…

Linux基础服务11——LNMP架构

文章目录 一、环境说明二、安装nginx三、安装mysql四、安装php五、配置nginx六、配置php七、验证 一、环境说明 主机服务192.168.161.129nginx192.168.161.131mysql192.168.161.132php 二、安装nginx 1.参考文章&#xff0c;nginx部署。 三、安装mysql 1.参考文章&#x…

隐私计算大会亮点前瞻:“隐私计算互联互通标准及第二批实践示范征集项目”解读预告

7月26日&#xff0c;2023隐私计算大会将于青岛正式扬帆&#xff0c;本次大会将齐聚业内专家大咖共论行业最新进展&#xff0c;洞察未来发展趋势&#xff0c;共同推进隐私计算行业蓬勃发展。本次大会将公开正式发布解读《隐私计算应用研究报告&#xff08;2023&#xff09;》、“…

QT6之QtWidgets和QWidget

1、概念 如上图&#xff1a; QtWidgets是模块&#xff0c;它不是类。它与Qt core模块等是同级别的模块&#xff0c;它提供了一系列类的来创建界面相关。QWidget是类&#xff0c;它不是模块。它是所有用户界面对象的基类&#xff0c;QWidget 及其子类是开发桌面应用的核心&…

隐私计算大会亮点前瞻:《隐私计算应用研究报告(2023年)》发布预告

7月26日&#xff0c;2023隐私计算大会将于青岛正式扬帆&#xff0c;本次大会将齐聚业内专家大咖共论行业最新进展&#xff0c;洞察未来发展趋势&#xff0c;共同推进隐私计算行业蓬勃发展。 本次大会将公开正式发布《隐私计算应用研究报告&#xff08;2023&#xff09;》、“隐…

IDEA 安装完成无法打开排查插件问题

以前我自己遇到IDEA&#xff08;19.3&#xff09;突然打不开了、所以写过一篇IDEA无法正常启动&#xff08;打不开&报错&#xff09;_idea启动报错_DJyzh的博客-CSDN博客版权声明&#xff1a;转载请附上文章地址https://blog.csdn.net/qq_42672839IDEA无法正常启动 今天在清…

演讲实录:以 AI 变革组织运营与管理

7月14日&#xff0c;以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会现场发布了 Kyligence 最新产品家族&#xff1a;AI 数智助理——Kyligence Copilot 的预览版、一站式指标平台 Kyligence Zen 的 Cloud 和 Enterprise 版本&#xf…

0基础学习VR全景平台篇 第66篇:VR直播-如何管理VR直播活动

一、电脑端管理 已创建好的VR直播活动可以在【管理后台】-【作品管理】-【VR直播】列表下查看到。 1、点击活动标题可以直接进入电脑端的播放页面&#xff0c;点击“编辑”按钮可以进入活动的设置界面。 2、电脑端播放页 该链接地址是可以自适应电脑端和手机端的&#xff0c…