IndexedDB基本操作案例

本文详细介绍了如何使用IndexedDB进行数据的增删改查操作,并演示了如何创建索引以提高查询效率。通过具体的HTML源码示例,读者可以了解到数据库的打开、表的创建、数据的添加、读取、更新、删除以及利用索引进行查询的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果演示

在这里插入图片描述

源码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <button "add()">
        添加
    </button>
    <button "read()">
        查询
    </button>
    <button "update()">
        更新
    </button>
    <button "remove()">
        删除
    </button>
    <button "indexQ()">
        索引查询
    </button>
    <script>
        // 数据库实例
        var db;
        // 打开或新建数据库和表
        function createDBAndTable() {
            // 打开数据库
            var request = window.indexedDB.open('lujing', '4.5');
            // 打开失败回调
            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('person', {
                    keyPath: 'id'
                });
                // 创建索引
                objectStore.createIndex('name', 'name', {
                    unique: false
                });
                // 创建索引
                objectStore.createIndex('email', 'email', {
                    unique: false
                });
            }

        }
        createDBAndTable();
        // 查询
        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('未获得数据记录');
                }
            };
        }
        // 添加
        function add() {
            var request = db.transaction(['person'], 'readwrite')
                .objectStore('person')
                .add({
                    id: 1,
                    name: '张三',
                    age: 24,
                    email: 'zhangsan@example.com'
                });

            request.onsuccess = function(event) {
                console.log('数据写入成功');
            };

            request.onerror = function(event) {
                console.log('数据写入失败', event);
            }
        }
        // 更新
        function update() {
            var request = db.transaction(['person'], 'readwrite')
                .objectStore('person')
                .put({
                    id: 1,
                    name: '李四',
                    age: 35,
                    email: 'lisi@example.com'
                });

            request.onsuccess = function(event) {
                console.log('数据更新成功');
            };

            request.onerror = function(event) {
                console.log('数据更新失败');
            }
        }
        // 删除
        function remove() {
            var request = db.transaction(['person'], 'readwrite')
                .objectStore('person')
                .delete(1);

            request.onsuccess = function(event) {
                console.log('数据删除成功');
            };
        }
        // 使用索引
        function indexQ() {
            var transaction = db.transaction(['person'], 'readonly');
            var store = transaction.objectStore('person');
            var index = store.index('name');
            var request = index.get('李四');

            request.onsuccess = function(e) {
                var result = e.target.result;
                if (result) {
                    console.log(JSON.stringify(result))
                } else {
                    console.log('没有查询到')
                }
            }
        }
    </script>
</body>

</html>

注意说明

创建ObjectStore(类似表)的时候需要在onupgradeneeded回调中创建,不能在onsuccess回调中创建

### IndexedDB 的基本概念 IndexedDB 是一种浏览器内置的数据库技术,允许开发者存储大量的结构化数据[^1]。它支持索引功能以便快速查询,并提供事务机制来确保数据一致性。 #### IndexedDB 的主要特点 - **大容量存储**:相比于 localStorage 和 sessionStorage,IndexedDB 提供更大的存储空间。 - **异步操作**:所有的 API 调用都是异步执行,防止阻塞主线程。 - **键值对存储**:类似于其他 NoSQL 数据库,IndexedDB 使用键值对的方式存储对象。 - **事务管理**:通过事务可以实现读写分离以及并发控制。 以下是创建和使用 IndexedDB 的简单示例: ```javascript // 打开或创建一个名为 'myDatabase' 的数据实例 let request = indexedDB.open('myDatabase', 1); request.onerror = function(event) { console.error('数据库打开失败'); }; request.onsuccess = function(event) { let db = event.target.result; console.log('数据库已成功打开:', db); }; request.onupgradeneeded = function(event) { let db = event.target.result; // 创建一个对象仓库 (Object Store),相当于表的概念 if (!db.objectStoreNames.contains('users')) { let objectStore = db.createObjectStore('users', { keyPath: 'id', autoIncrement: true }); // 添加索引字段 objectStore.createIndex('name', 'name', { unique: false }); objectStore.createIndex('email', 'email', { unique: true }); console.log('新对象仓库 users 已创建'); } }; ``` 这段代码展示了如何初始化 IndexedDB 并设置基础的对象仓库 `users` 及其索引[^2]。 --- ### 学习资源推荐 对于初学者来说,可以从官方文档入手了解核心概念和技术细节[^3]。此外还有许多在线平台提供了丰富的教程内容可供参考: 1. **MDN Web Docs**: Mozilla 开发者网络上的 [IndexedDB 文档](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) 非常详尽,适合深入研究。 2. **Google Developers Blog**: Google 官方博客经常发布有关 IndexedDB 性能优化的文章[^4]。 3. **TutorialsPoint**: 这是一个面向新手友好的网站,其中包含了大量易于理解的例子[^5]。 4. **YouTube 视频课程**: 许多高质量视频讲解了实际项目中的应用案例,比如离线优先架构设计等主题。 如果希望进一步提升技能水平,则可以通过阅读开源项目的源码或者参与社区讨论等方式积累经验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值