HTML5 Web IndexedDB 数据库

ops/2024/12/28 1:12:55/

IndexedDB 是一种基于浏览器的 NoSQL 数据库,用于在客户端持久化存储大量结构化数据。

IndexedDB 允许通过键值对存储复杂的数据对象(如对象、数组、文件等),并支持事务、索引、版本控制和复杂查询操作。

IndexedDB 是异步的,不会阻塞主线程,适合离线应用程序、缓存等场景。

IndexedDB 非常适合需要存储大量结构化数据的应用程序,尤其是那些希望支持离线模式或处理复杂查询的 Web 应用。

IndexedDB 特性
  • 键值对存储:数据以键值对的形式存储在对象存储(object store)中。
  • 事务支持:所有数据操作必须在事务内完成,以确保数据一致性和完整性。
  • 异步 API:所有操作都是异步的,不会阻塞 UI 线程,使用事件回调或 Promises 来处理结果。
  • 版本控制数据库使用版本号来管理数据库的架构(如创建或修改对象存储)。
  • 索引:支持对数据的字段建立索引,以加快查询速度。
  • 离线支持:数据可以持久化存储并在断网情况下继续访问,非常适合构建离线 Web 应用。
IndexedDB 语法

IndexedDB 语法说明如下:

// 打开或创建一个数据库
varrequest=indexedDB.open(‘databaseName’,version);

// 处理数据库升级
request.onupgradeneeded=function(event){
vardb=event.target.result;

// 创建对象存储(表)并设置主键
varobjectStore=db.createObjectStore(‘storeName’,{keyPath:‘id’});

// 创建索引
objectStore.createIndex(‘fieldName’,‘fieldName’,{unique:false});
};

// 数据库打开成功时的回调
request.onsuccess=function(event){
vardb=event.target.result;

// 进行事务操作
vartransaction=db.transaction(‘storeName’,‘readwrite’);
varobjectStore=transaction.objectStore(‘storeName’);

// 插入数据
objectStore.add({id:1,name:‘John Doe’,age:30});

// 查询数据
varquery=objectStore.get(1);
query.onsuccess=function(event){
console.log(event.target.result);
};
};

// 错误处理
request.οnerrοr=function(event){
console.error(‘Database error:’,event.target.error);
};

IndexedDB 方法

**1、indexedDB.open():**用于打开现有数据库或创建新数据库

var request = indexedDB.open(‘databaseName’, version);

**2、db.createObjectStore():**在 onupgradeneeded 事件中创建对象存储(类似表)。

var objectStore = db.createObjectStore(‘storeName’, { keyPath: ‘id’ });

**3、objectStore.add():**在事务中向对象存储中添加数据。

objectStore.add({ id: 1, name: ‘John Doe’ });

**3、objectStore.get():**根据键值从对象存储中获取数据。

var request = objectStore.get(1);

**4、objectStore.put():**更新现有记录,若记录不存在则插入。

objectStore.put({ id: 1, name: ‘John Updated’ });

**5、objectStore.delete():**根据键值删除记录。

objectStore.delete(1);

**6、db.transaction():**创建事务,指定对象存储名称和事务模式(readonly 或 readwrite)。

var transaction = db.transaction([‘storeName’], ‘readwrite’);

**7、objectStore.createIndex():**为对象存储中的字段创建索引,以便更快的查询。

objectStore.createIndex(‘nameIndex’, ‘name’, { unique: false });


IndexedDB 应用实例

以下是一个完整的 IndexedDB 实例,用于创建数据库、插入数据、查询数据并更新数据。

实例

// 打开或创建数据库
varrequest=indexedDB.open(‘myDatabase’,1);

// 如果数据库版本变化或首次创建时触发
request.onupgradeneeded=function(event){
vardb=event.target.result;

// 创建对象存储(表),设置主键为 ‘id’
varobjectStore=db.createObjectStore(‘customers’,{keyPath:‘id’});

// 为 ‘name’ 字段创建索引
objectStore.createIndex(‘name’,‘name’,{unique:false});
};

// 打开数据库成功
request.onsuccess=function(event){
vardb=event.target.result;

// 插入数据
vartransaction=db.transaction([‘customers’],‘readwrite’);
varobjectStore=transaction.objectStore(‘customers’);
objectStore.add({id:1,name:‘John Doe’,email:‘john@example.com’});
objectStore.add({id:2,name:‘Jane Doe’,email:‘jane@example.com’});

transaction.oncomplete=function(){
console.log(‘Transaction completed: data added.’);
};

transaction.οnerrοr=function(event){
console.error(‘Transaction failed:’,event);
};

// 查询数据
varqueryTransaction=db.transaction([‘customers’]);
varqueryObjectStore=queryTransaction.objectStore(‘customers’);
varquery=queryObjectStore.get(1);

query.onsuccess=function(event){
console.log(‘Customer:’,event.target.result);
};

// 更新数据
varupdateTransaction=db.transaction([‘customers’],‘readwrite’);
varupdateObjectStore=updateTransaction.objectStore(‘customers’);
varupdatedCustomer={id:1,name:‘John Smith’,email:‘johnsmith@example.com’};

updateObjectStore.put(updatedCustomer);

updateTransaction.oncomplete=function(){
console.log(‘Transaction completed: data updated.’);
};
};

// 错误处理
request.οnerrοr=function(event){
console.error(‘Database error:’,event.target.error);
};


IndexedDB 使用场景

  • 离线存储:IndexedDB 允许你存储数据以便在没有网络连接时访问,这对于离线 Web 应用至关重要。

  • 缓存:可以用于存储大量缓存数据(如文件、图片、视频),提升应用的加载速度。

  • 复杂数据处理:适用于需要存储和处理大量结构化数据的场景,尤其是需要索引和查询功能。

  • 本地数据库:IndexedDB 可以作为前端应用的本地数据库,存储用户数据、配置信息、应用状态等。


IndexedDB 的优势

  • 大容量存储:支持更大数据存储(常常可以达到几百 MB 或更多),比 localStorage 的 5MB 限制大得多。

  • 丰富的数据操作:支持事务、索引、查询、批量处理等复杂操作。

  • 离线支持:数据保存在用户设备上,可以离线访问并同步到服务器。


IndexedDB 的劣势

  • API 复杂:相比 localStorage 等简单的客户端存储,IndexedDB API 相对复杂,需要更多的代码。

  • 异步处理:操作异步执行,初学者可能会不习惯处理回调或 Promise。

  • IndexedDB 非常适合需要存储大量结构化数据的应用程序,尤其是那些希望支持离线模式或处理复杂查询的 Web 应用。


http://www.ppmy.cn/ops/145527.html

相关文章

读书笔记~管理修炼-缄默效应

缄默效应:学会正确批评下属 员工明明犯了错误,却不及时告知你,总是拖到最后一刻无法弥补时才不得不承认出了问题——你遇到过这样的问题吗? 这其实是缄默效应在发挥作用。 在职场中,即使再扁平化的环境&…

Django 模型中使用 `UniqueConstraint` 实现唯一性约束

在 Django 中,我们经常需要对模型的字段进行唯一性约束,以确保数据的完整性和一致性。虽然 Django 提供了 unique=True 参数来实现单个字段的唯一性约束,但有时我们需要对多个字段组合进行唯一性约束。这时,UniqueConstraint 就派上用场了。 © ivwdcwso (ID: u0121725…

Flutter persistentFooterButtons控件详解

文章目录 1. persistentFooterButtons 的用途2. persistentFooterButtons 的定义3. persistentFooterButtons 的基本用法示例 1:简单的底部按钮解释: 4. persistentFooterButtons 的常见用法示例 2:使用不同的按钮类型解释:示例 3…

【Trick】解决服务器cuda报错——RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

本人在服务器上训练代码时&#xff0c;遇到了以下报错&#xff1a; Traceback (most recent call last):File "/home/ubuntu/zcardvein/zzz_dataAndTrain.py", line 163, in <module>preds model(img_batch)File "/home/ubuntu/miniconda3/lib/python3.…

[实战]Docker应用自动重启

场景 Java应用&#xff0c;在凌晨定时任开始时运行一段时间后&#xff0c;会自动重启&#xff0c;导致定时任务失败。该应用使用Docker部署 分析 Docker应用运行一段时间自动重启可能的原因为容器分配的资源&#xff08;如CPU、内存&#xff09;不足&#xff0c;系统可能会杀…

docker怎么复制容器的文件到宿主机

在Docker中&#xff0c;你可以使用docker cp命令来复制文件从容器到宿主机&#xff0c;或者从宿主机到容器。以下是如何将文件从容器复制到宿主机的步骤&#xff1a; 确定容器ID或名称&#xff1a;首先&#xff0c;你需要知道你想要复制文件的容器的ID或名称。你可以使用docker…

《手写Mybatis渐进式源码实践》实践笔记(第七章 SQL执行器的创建和使用)

文章目录 第七章 SQL执行器的定义和实现背景技术背景模板模式特点结构示例代码&#xff08;Java&#xff09; 业务背景 目标设计实现工程代码类图实现步骤1.执行器的定义和实现1-1. Executor定义执行器接口1-2.BaseExecutor执行器抽象基类1-3. SimpleExecutor 简单执行器实现 2…

冰狐智能辅助使用插件化开发集成三方ocr

插件化开发&#xff08;Plugin Development&#xff09;是一种软件开发模式&#xff0c;它将一个应用程序的功能拆分为模块&#xff0c;并允许在运行时动态加载、卸载和扩展这些模块&#xff0c;以增强应用程序的功能。冰狐支持动态加载和卸载第三方插件模块&#xff0c;开发者…