indexedDB---浏览器内建的数据库(学习记录)

本文介绍了IndexedDB,一种强大的浏览器内置数据库,对比了它与localStorage的区别,包括支持的数据类型、事务、索引以及跨域限制。文章还提供了创建和操作IndexedDB的JavaScript代码示例。
摘要由CSDN通过智能技术生成

IndexedDB

IndexedDB 是一个浏览器内建的数据库,它比 localStorage 强大得多。

  • 通过支持多种类型的键,来存储几乎可以是任何类型的值。
  • 支撑事务的可靠性。
  • 支持键值范围查询、索引。
  • 和 localStorage 相比,它可以存储更大的数据量。

要注意的点是,网页只能访问自身域名下的indexedDB数据库,而不能访问跨域的数据库。

代码和结果

// 浏览器本地数据库
// console.log(indexedDB);
// indexedDB结构:
// 数据库(库)->对象库(表)->存储的数据(key/value)
// indexedDB下可以有多个数据库,每个数据库下可以有多个对象库
// 数据库可以有许多不同的名称,但是必须存在于当前的源(域/协议/端口)中。不同的网站不能相互访问对方的数据库。
let dbName = "test";
// 打开\创建一个数据库(若原数据库版本低,则更新;若原数据库版本高,则保持)
let request = indexedDB.open(dbName,7);// 数据库的名称 string,版本号 number默认为1
let db ;// 打开数据库成功后存放数据库对象
console.log(request);

// 数据库已准备就绪,当尝试打开版本号高于其当前版本的数据库时,将触发该事件(更新)
// 在 upgradeneeded 处理程序中,只有在创建数据库版本时,对象库被才能被 创建/修改。这表示要对对象库操作需要更新一次版本
request.onupgradeneeded = (e)=>{
    console.log(e);// 数据库中的内容
    db = request.result;
    // 创建存储库对象
    let store = "user"; // 存储对象库名
    let keyOptions = {
        keyPath : "id",// 主键,访问存储对象的属性路径,例如id,这表示存储的数据属性中必须要有id属性
        autoIncrement: false //  autoIncrement为true,则自动生成新存储的对象的键,键是一个不断递增的数字,
    }
    if (!db.objectStoreNames.contains(store)) { // 如果没有 “user” 数据
        // 此方法应该在upgradeneeded事件中执行,否则将报错(应该在upgradneeded事件的回调函数中调用createObjectStore方法创建store object,不应该在success的回调中,否则会报错)
        db.createObjectStore(store,keyOptions); 
    }
    delDB(db);
}
// 数据库打开失败
request.onerror = ()=>{
    // 如果当前用户的数据库版本比 open 调用的版本更高(比如当前的数据库版本为 3,我们却尝试运行 open(...2),就会产生错误并触发 openRequest.onerror)。
    console.log("数据库连接失败"+request.error);
}
// 数据库已就绪
request.onsuccess = ()=>{
    console.log("数据库连接成功");// 数据库中的内容
    db = request.result;
    console.log(db);
    // 监听低版本号数据库,触发则关闭数据库
    db.onversionchange = function() {
        db.close();
        console.log("数据库版本低已关闭,请重启页面.")
    };
    let store = "user"; // 存储对象库名
    // add(db,store);
    read(db,store)
}
// 数据库操作阻塞时触发
request.onblocked = ()=>{
    db.close();
    console.log("数据库操作失败已关闭.")
}

// 事务操作存储、删除数据
function add(db,store){
    let transaction = db.transaction(store,"readwrite");// 操作user的事务,对其开放读写权限,默认只读readonly
    // 获取对象库进行操作
    let user = transaction.objectStore(store);
    let data = {
        id :1,
        name : "Tom",
        age : 18
    }   
    let addData = user.add(data);
    addData.onerror = ()=>{
        console.log("数据添加成功"+addData.result);
    }
    addData.onsuccess = ()=>{
        console.log("数据添加失败"+addData.error);
    }
}
// 事务操作读取数据
function read(db,store){
    let transaction = db.transaction(store,"readwrite");// 操作user的事务,对其开放读写权限,默认只读readonly
    // 获取对象库进行操作
    let user = transaction.objectStore(store);
    let read =  user.get(1);
    read.onsuccess = ()=>{
        console.log(read.result);
    };
}
function delDB(db){
    db.close();
    // 删除这个数据库(需要先关闭才能删除)
    indexedDB.deleteDatabase(db.result.name);
}
function delStore(db,name){// 删除一个对象库name
    db.deleteObjectStore(name);
}

本文章仅作为记录,想学习更多indexed DB相关内容可以参考:

indexedDB---掌握浏览器内建数据库的基本用法-CSDN博客

浏览器数据库 IndexedDB 入门教程 - 阮一峰的网络日志 (ruanyifeng.com)

IndexedDB (javascript.info)

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: IndexedDB 是一种浏览器内置的 NoSQL 数据库,允许您在浏览器中存储和检索数据。下面是一个基本的 IndexedDB 示例: ```javascript // 打开 IndexedDB 数据库 var request = window.indexedDB.open("myDatabase", 1); // 处理成功和失败事件 request.onerror = function(event) { console.log("Database error: " + event.target.errorCode); }; request.onsuccess = function(event) { console.log("Database opened successfully"); var db = event.target.result; // 添加数据到数据库 var transaction = db.transaction(["customers"], "readwrite"); var objectStore = transaction.objectStore("customers"); var customer = { name: "John", email: "john@example.com" }; var request = objectStore.add(customer); request.onsuccess = function(event) { console.log("Customer added to database"); }; // 从数据库中检索数据 var transaction = db.transaction(["customers"], "readonly"); var objectStore = transaction.objectStore("customers"); var request = objectStore.get(1); request.onerror = function(event) { console.log("Error retrieving customer"); }; request.onsuccess = function(event) { var customer = event.target.result; console.log("Retrieved customer: " + customer.name); }; }; // 创数据库架构 request.onupgradeneeded = function(event) { var db = event.target.result; var objectStore = db.createObjectStore("customers", { keyPath: "id", autoIncrement: true }); objectStore.createIndex("name", "name", { unique: false }); objectStore.createIndex("email", "email", { unique: true }); }; ``` 这段代码会创一个名为 "myDatabase" 的 IndexedDB 数据库,其中包含一个名为 "customers" 的对象仓库,用于存储客户数据。该代码还演示了如何向数据库添加数据、从数据库检索数据以及如何创对象仓库和索引。 ### 回答2: IndexedDB 是一种在 web 浏览器中使用的客户端存储数据库。它可以用于存储大量结构化数据,并且能够在离线状态下进行访问。 一个使用 IndexedDB 的实例可以是一个在线笔记应用。在这个应用中,用户可以创、编辑和删除笔记。使用 IndexedDB,应用可以将这些笔记存储在本地,以便用户在断网或者关闭浏览器后仍然可以访问。 在这个应用中,首先需要创一个数据库,用于存储笔记的数据。然后,可以创一个 object store,用于存储每一条笔记的数据。每一条笔记可以由一个对象表示,其中包含标题、内容和日期等属性。 当用户创新的笔记时,应用会将该笔记的数据添加到 object store 中。当用户编辑或者删除笔记时,应用会相应地更新或者删除 object store 中对应的数据。 当用户重新打开应用时,可以从 IndexedDB 中获取存储的笔记数据,并在界面上展示出来。用户可以通过界面进行编辑,应用会即时地更新 IndexedDB 中的数据。 除了基本的增删改查操作,IndexedDB 还提供了强大的查询功能。通过使用索引,可以高效地搜索和过滤数据。例如,可以根据标题关键字进行搜索,并返回包含该关键字的所有笔记。 总而言之,IndexedDB 提供了一种方便可靠的方式来在 web 浏览器中存储大量结构化数据。通过使用它,可以实现很多实用的应用,如在线笔记应用等。 ### 回答3: IndexedDB 是 HTML5 标准中的一种客户端数据库,可以在浏览器中存储和操作大量的结构化数据。下面是一个使用 IndexedDB 的示例: 首先,在 JavaScript 中创一个 IndexedDB 数据库,并指定数据库的名称和版本号: ```javascript let request = indexedDB.open('myDatabase', 1); ``` 然后,在打开数据库成功的回调函数中创一个对象存储空间(类似于表): ```javascript request.onsuccess = (event) => { let db = event.target.result; let objectStore = db.createObjectStore('myObjectStore', { keyPath: 'id' }); }; ``` 现在,可以向对象存储空间中添加数据项: ```javascript request.onsuccess = (event) => { let db = event.target.result; let transaction = db.transaction('myObjectStore', 'readwrite'); let objectStore = transaction.objectStore('myObjectStore'); let data = { id: 1, name: 'John', age: 25 }; let request = objectStore.add(data); request.onsuccess = (event) => { console.log('Data added successfully'); }; request.onerror = (event) => { console.error('Error adding data'); }; }; ``` 还可以使用索引检索数据: ```javascript request.onsuccess = (event) => { let db = event.target.result; let transaction = db.transaction('myObjectStore', 'readonly'); let objectStore = transaction.objectStore('myObjectStore'); let index = objectStore.index('name'); let request = index.get('John'); request.onsuccess = (event) => { let data = event.target.result; console.log(`Name: ${data.name}, Age: ${data.age}`); }; request.onerror = (event) => { console.error('Error retrieving data'); }; }; ``` 此外,还可以更新和删除数据、创和删除索引等等。这只是一个简单的使用 IndexedDB 的示例,实际应用中可以根据需求进行更复杂的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值