Commit 58886c86 authored by zhangshun's avatar zhangshun

分享indexdb提交

parent b0e2c3af
Pipeline #17336 canceled with stage
---
title: JavaScript中的IndexedDB使用
date: 2022/8/30 17:20:00
author: 张顺
---
## 什么是IndexedDB?
IndexedDB是一种在浏览器端存储数据的方式,它丰富了客户端的查询方式,并且因为是本地存储,可以有效的减少网络数据对页面的影响。
## 有什么特点?
- 键值对储存:indexDB采用对象仓库存放数据,所有类型的数据都可以存入。
- 异步:indexDB操作不会锁死浏览器
- 支持事务:操作步骤中一步失败,整个事务取消,不存在只改写一部分数据的情况
- 同源限制:不能访问跨域数据库,只能访问自身域名下的数据库。
- 储存空间大:一般来说不少于250MB,没上限
- 支持二进制储存:可以存储字符串,而且可以存储二进制数据。
### IndexDB中的对象
- 数据库:IDBDatabase对象
- 对象仓库:IDBObjectStore对象
- 索引:IDBIndex
- 事务:IDBTransaction对象
- 操作请求:IDBRequest对象
- 指针:IDBCursor对象
- 键集合:IDBKeyRange对象
### 如何使用
``` JS
1. //打开一个数据库
var db ;
var reqDB = window.indexedDB.open("dbName", 'version');
2. //新建数据库
reqDB.onsuccess = function (event) { // 监听数据库创建成功事件
let db = event.target.result // 数据库对象
console.log('数据库打开成功')
}
reqDB.onerror = function (error) {
console.log('数据库打开报错')
}
reqDB.onupgradeneeded = function (event) {
// 数据库创建或升级的时候会触发
db = event.target.result
let storeName = '表名' // 表名
if (!db.objectStoreNames.contains(storeName)) { // 判断表是否存在
let objectStore = db.createObjectStore(storeName, { keyPath: '主键',autoIncrement: true }) //autoIncrement z主键是否自增
}
}
//dbName:数据库名字,数据库不存在就新建数据库,新建数据库默认版本为1;
//version:表示数据库的版本,整数,如果省略,默认为当前版本。
// indexDB.open()方法返回一个IDBRequest对象。这个对象通过error,success,upgradeneeded处理打开数据库的操作结果。
// db.createObjectStore可以创建一张表,param1 表名,param2 配置对象,keyPath为主键,autoIncrement是自动生成一个自增主键,一般keyPath和autoIncrement只需要一个,两个都存在的话,自动生成一个自增主键,并且keyPath设置的字段必须要存在
// upgradeneedend数据库升级
// 如果指定的版本号大于数据库实际版本号,就会发生数据库升级事件
3,//建索引
//建索引为了进行搜索
reqDB.onupgradeneeded = function (event) {
// 数据库创建或升级的时候会触发
db = event.target.result
let storeName = '表名' // 表名
if (!db.objectStoreNames.contains(storeName)) { // 判断表是否存在
let objectStore = db.createObjectStore(storeName, { keyPath: '主键',autoIncrement: true })
objectStore.createIndex('name', 'name', { unique: false,multiEntry:true }) // 创建索引 可以让你搜索任意字段
}
}
//unique 唯一
//multiEntry 对于有多个值的主键数组,每个值将在索引里面新建一个条目,否则主键数组对应一个条目
4,//添加数据
//需要通过事务对象IDBTransaction 来获取到对象仓库(表),然后通过对象仓库的add()方法向表中添加数据
// 2. 创建事务对象
const t = reqDB.transaction(['表名'], 'readwrite') // readwrite 读写权限模式
// 3. 拿到对象仓库
const objectStore = t.objectStore('表名')
// 4. 添加数据
const req = objectStore.add({xxx: 123456, yyy: '7890'}) // 添加的数据
// 5. 操作成功
req.success = function (e) {}
// 6. 操作失败
req.success = function (e) {}
// 注:1234 可使用点操作符连写
const req = reqDB.transaction(['表名'], 'readwrite')
.objectStore('表名')
.add({xxx: 123456, yyy: '7890'})
5,//修改数据
//同添加流步骤一样,使用对象仓库的put方法,修改表中数据,更新id为1的数据
objectStore.put({id: 1, xxx: 123456, yyy: '7890'})
5,//删除数据
//使用对象仓库的delete方法,删除表中数据,根据id删除
objectStore.delete(1)
6,//获取数据
//使用对象仓库的get方法,获取对应主键的数据,获取id为1的数据
objectStore.get(1)
```
......@@ -16,7 +16,7 @@ tags:
方括号查询范围内符合的内容,在方括号中可以包含多个字符,表示匹配其中任意一个字符。如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。例如: (注意:中括号内不能有空格 ,否则会误解为还要匹配空格)
| 正则表达式模式 | 说明 |
| ---- | ---- |
| ---- | ---- | ----|
| `(x|y)` | 查找任何以 `|`分隔的选项。 |
| [abc] | 查找方括号内任意一个字符。 |
| [^abc]| 查找不在方括号内的字符。|
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment