HTML5 indexedDB数据库二之索引查询和游标

本文介绍了如何在数据库中利用索引和游标进行高效的数据检索。包括通过索引获取特定记录、使用游标遍历所有数据以及结合索引与游标的高级应用。

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

接上一章:

//创建查询函数
function getDataByIndex(db, storeName) {
    var tx = db.transaction(storeName);//获取查询事务
    var store = tx.objectStore(storeName);//查询并获得表
    var index = store.index("name_index");//获得索引
    index.get("小B").onsuccess = function(e){//通过索引回调获得“小B”的信息对象
        var stu = e.target.result;
        console.info(stu.name + " " + stu.age + " " + stu.id);
    };
    var index_age = store.index("index_age");
    index_age.get(18).onsuccess = function(e) {
    //这里只能获取到第一个age为18的stu,虽然age索引不是唯一的,获得多个需要使用游标
        var sudent = e.target.result;
    };
}

 

//通过游标获取全部数据
function getAllData(db, storeName) {
    var tx = db.transaction(storeName);
    var store = tx.objectStore(storeName);
    var c =store.openCursor();//打开游标
    c.onsuccess = function(e) {//成功执行回调
        var cursor = e.target.result;
        if (cursor){//如果存在
            console.log(cursor.key);//key是表的主键
            var stu = cursor.value;
            console.log(stu.name);
            cursor.continue();//继续下一个
        }
    }
}
//index and cursor 索引和游标同时使用
function getData(db, storeName) {
    var tx = db.transaction(storeName);
    var store = tx.objectStore(storeName);
    var index = store.index("index_age");
    //打开游标,通过IDBKeyRange设置游标范围,这里设置为只获取age等于18的数据
    var c = index.openCursor(IDBKeyRange.only(18));
    c.onsuccess = function(e) {//成功执行回调
        var cursor = e.target.result;
        if (cursor){//如果存在
            console.log(cursor.key);//key是表的主键
            var stu = cursor.value;
            console.log(stu.name);
            cursor.continue();//继续下一个
        }
    }
}

 

//IDBKeyRange.only(val);只获取指定数据
//IDBKeyRange.lowerBuund(val, isOpened);获取在val以前或者小的数据,isOpened是开闭区间,false是包含val(闭区间),true是不包含val(开区间)
//IDBKeyRange.upperBuund(val, isOpened);获取在val以后或者大的数据,isOpened是值开闭区间,false是包含val(闭区间),true是不包含val(开区间)
//IDBKeyRange.buund(val1, val2, isOpened1, isOpened2);获取在value1与value2之间的数据,isOpened1和isOpened2分别是左右开闭区间

 

 

<think>好的,我现在需要帮助用户了解如何使用HTML5IndexedDB创建数据库。根据用户提供的引用内容,特别是引用[1]引用[2],创建数据库的第一步是打开它,而打开数据库的过程实际上也会创建它。所以,我应该从打开数据库的步骤开始讲解。 首先,用户可能需要知道IndexedDB的基本概念,比如数据库名称版本。引用[4]提到每个数据库必须具有唯一的名称,所以示例中应该包含如何指定数据库名称版本号。然后,引用[1]指出基本操作的第一步是打开数据库,所以代码示例中需要使用indexedDB.open方法。 接下来,用户可能需要了解如何处理数据库升级的情况,比如当版本号改变时,需要创建对象存储空间。引用[3]提到对象仓库是数据库的一部分,所以在onupgradeneeded事件中应该创建对象存储空间,并可能定义索引,如引用[3]中提到的游标索引的重要性。 然后,应该包括成功打开数据库后的处理,比如在onsuccess回调中获取数据库实例,如引用[2]中的示例。此外,错误处理也是必要的,所以onerror事件的处理也应该包含在代码中。 用户可能还需要一个完整的示例代码,展示从打开数据库到创建对象存储空间的整个过程。同时,相关问题部分需要生成创建数据库相关的扩展问题,例如版本管理、对象存储空间创建、错误处理等,这些可以基于引用内容中的信息,如引用[3]引用[4]提到的索引多个数据库的情况。 最后,需要确保按照用户的格式要求,使用中文回答,行内公式正确(虽然这个问题可能不涉及数学公式,但需要检查是否有其他需要格式化的部分),并正确添加引用标识。同时,生成的示例代码需要用正确的JavaScript语法,并注释说明每个步骤的作用,帮助用户理解。</think>### 使用 HTML5 IndexedDB 创建数据库的步骤 #### 1. 打开/创建数据库 通过`indexedDB.open()`方法打开数据库,如果数据库不存在则自动创建。需要指定数据库名称版本号: ```javascript let request = indexedDB.open("MyDatabase", 1); // 数据库名称为"MyDatabase",初始版本为1[^1] ``` #### 2. 处理升级事件 当首次创建或版本号变更时,需在`onupgradeneeded`事件中创建对象存储空间: ```javascript request.onupgradeneeded = function(event) { let db = event.target.result; // 创建名为"customers"的对象存储空间,定义主键为自增id let objectStore = db.createObjectStore("customers", { keyPath: "id", autoIncrement: true }); // 创建索引(通过email字段快速查询) objectStore.createIndex("email", "email", { unique: true })[^3]; }; ``` #### 3. 处理成功/错误回调 ```javascript request.onsuccess = function(event) { let db = event.target.result; // 获取数据库实例[^2] console.log("数据库已打开:", db.name); }; request.onerror = function(event) { console.error("数据库打开失败:", event.target.error); }; ``` #### 完整示例 ```html <!DOCTYPE html> <script> const dbName = "EmployeeDB"; const dbVersion = 2; // 版本号变更会触发onupgradeneeded let dbRequest = indexedDB.open(dbName, dbVersion); dbRequest.onupgradeneeded = (e) => { const db = e.target.result; if (!db.objectStoreNames.contains('employees')) { const store = db.createObjectStore('employees', { keyPath: 'employeeId' }); store.createIndex('department', 'department', { unique: false }); } }; dbRequest.onsuccess = (e) => { console.log('数据库准备就绪'); const database = e.target.result; // 后续操作使用此数据库引用[^2] }; dbRequest.onerror = (e) => { console.error(`数据库错误: ${e.target.error}`); }; </script> ``` ### 关键特性说明 1. **版本控制**:每次数据库结构变更需要升级版本号 2. **事务性操作**:所有数据操作必须在事务中执行 3. **异步API**:所有操作通过事件回调处理[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值