ToB企服应用市场:ToB评测及商务社交产业平台

标题: 解锁Web数据存储:欣赏器数据库 IndexedDB [打印本页]

作者: 民工心事    时间: 前天 19:55
标题: 解锁Web数据存储:欣赏器数据库 IndexedDB
1、欣赏器数据存储

欣赏器中的数据存储,日常接触较多的有Cookie、SessionStorage、LocalStorage,接下来引入一个重头嘉宾:IndexedDB;下面看它们四个在生命周期、存储大小、存储形式上的对比:
Cookie


Expires/Max-Age过期时间
Path有效路径,/表示对当前网站所有路径有效
Domain有效域名)
HttpOnly配置后只答应http访问,不答应js访问
Secure只会在https中发送
SessionStorage


LocalStorage


2、IndexedDB

IndexedDB 是一种在欣赏器中存储大量结构化数据的数据库
特点


利用步调

MDN对于IndexedDB的利用指南:IndexedDB - Web API | MDN
1、打开数据库,调用indexedDB.open()
  1. // 打开我们的数据库
  2. // @param {string} --数据库名称
  3. // @param {number} --数据库版本号
  4. const request = window.indexedDB.open("MyTestDatabase", 1);
  5. let db;
  6. // 打开MyTestDatabase数据库失败时触发
  7. request.onerror = function(event) {
  8.     console.error('Error opening IndexedDB:', event.target.errorCode);
  9. };
  10. // 打开MyTestDatabase数据库成功时触发
  11. request.onsuccess = function(event) {
  12.     console.log('IndexedDB 打开成功');
  13.     db = event.target.result;
  14. };
复制代码


2、在数据库中创建对象存储(object store),利用createObjectStore来创建对象存储
  1. // createObjectStore函数
  2. // @param {string} --对象存储的名称
  3. // @param {object} --其中keyPath定义的是主键
  4. request.onupgradeneeded = function(event) {
  5.     db = event.target.result;
  6.     if (!db.objectStoreNames.contains('UserStore')) {
  7.         db.createObjectStore('UserStore', { keyPath: 'userId' });
  8.     }
  9. };
复制代码
onupgradeneeded 事件的触发机遇

3、启动事务,来执行一些数据库操作,如添加或获取数据等
「 3-1 新增数据 」
  1. // transaction函数
  2. // @param {string[]} --想要访问的对象存储的数组
  3. // @param {readonly | readwrite } --事务模式
  4. // 调用 add函数
  5. function cacheUserData(userId, saveData) {
  6.     // 创建一个涉及userdata对象存储的读写事务
  7.     const transaction = db.transaction(['UserStore'], 'readwrite');
  8.     // 获取userdata对象存储,为后续对该对象存储的数据操作做铺垫
  9.     const store = transaction.objectStore('UserStore');
  10.     // 对userdata对象存储进行数据添加
  11.     const request = store.add({ userId, saveData });
  12.    
  13.     // 执行成功
  14.     request.onsuccess = function(event) {
  15.         console.log('UserStore cached successfully:', userId);
  16.     };
  17.    
  18.     // 执行失败
  19.     request.onerror = function(event) {
  20.         console.error('Error caching Data:', event.target.error);
  21.     };
  22. }
  23. // 添加数据
  24. const mydata = {
  25.   name: '昔冰',
  26.   age: 18,
  27.   gender: '男',
  28.   address: '河北省衡水市'
  29. }
  30. cacheUserData(Date.now(), mydata)
复制代码
「 3-2 删除数据 」
  1. // 调用 delete函数
  2. function deleteUserData(userId){
  3.     if (!userId) return alert('参数错误')
  4.     const transaction =db.transaction(['UserStore'],'readwrite')
  5.     const store=transaction.objectStore('UserStore')
  6.     const request=store.delete(userId)
  7.     request.onsuccess = function(event) {
  8.         console.log("数据删除成功");
  9.     };
  10.     request.onerror = function(event) {
  11.         console.error("数据删除失败", event.target);
  12.     };
  13. }
复制代码
「 3-3 查询数据 」
  1. // 按id查询数据 get()
  2. function queryUserDataById(userId) {
  3.   if (!userId) return alert('参数错误')
  4.   const transaction = db.transaction(['UserStore'], 'readonly')
  5.   const store = transaction.objectStore('UserStore')
  6.   const request = store.get(userId)
  7.   console.log(userId)
  8.   request.onsuccess = function (event) {
  9.     if (event.target.result) console.log('获取到数据::', event.target.result)
  10.     else console.log('未找到数据')
  11.   }
  12.   request.onerror = function (event) {
  13.     console.log('获取数据失败')
  14.   }
  15. }
  16. // 查询所有数据 getAll()
  17. function queryUserData() {
  18.   const transaction = db.transaction(['UserStore'], 'readonly')
  19.   const store = transaction.objectStore('UserStore')
  20.   const data = []
  21.   const request=store.getAll()
  22.   request.onsuccess = function (event) {
  23.     if (event.target.result) console.log('获取到数据::', event.target.result)
  24.     else console.log('未找到数据')
  25.   }
  26.   request.onerror = function (event) {
  27.     console.log('获取数据失败')
  28.   }
  29. }
复制代码
「 3-4 更新数据 」
  1. // 先调用 get函数来获取对应的数据,再通过 put函数来更新数据
  2. function updateUserData(userId, newData = {}) {
  3.   if (!userId) return alert('参数错误')
  4.   const transaction = db.transaction(['UserStore'], 'readwrite')
  5.   const store = transaction.objectStore('UserStore')
  6.   const request = store.get(userId)
  7.   request.onsuccess = function (event) {
  8.     const data = event.target.result
  9.     // 注意这里只对data更新了saveData数据,没有改变userId,如果变动了userId则无法更新成功
  10.     Object.assign(data, { saveData: newData })
  11.     const requestUpdate = store.put(data)
  12.     requestUpdate.onerror = (event) => {
  13.       console.log('数据更新错误')
  14.     }
  15.     requestUpdate.onsuccess = (event) => {
  16.       console.log('数据更新成功')
  17.     }
  18.   }
  19. }
  20. // 绑定事件更新数据
  21. const btnUpdateUser = document.querySelector('.update-user')
  22. btnUpdateUser.addEventListener('click', () => {
  23.   const newData = {
  24.     address: '天津市和平区',
  25.     age: 19,
  26.     gender: '女',
  27.     name: '王美丽'
  28.   }
  29.   updateUserData(1736924438112, newData)
  30. })
复制代码
3、注意事项

数据库对象的赋值机遇


数据修改操作


  1. // 创建对象存储时
  2. db.createObjectStore('UserStore', { keyPath: 'userId', autoIncrement: true })
  3. // 添加数据时
  4. const addBtn = document.querySelector('.addUser')
  5. addBtn.addEventListener('click', () => {
  6.   // 创建一个事务,找对应的对象存储做对应的操作
  7.   const transaction = db.transaction(['UserStore'], 'readwrite')
  8.   // 获取具体你要操作的对象存储
  9.   const store = transaction.objectStore('UserStore')
  10.   // 新增数据
  11.   const obj = {
  12.     // 不需要配置userId及数据
  13.     userData: {
  14.       id: Date.now(),
  15.       name: '昔冰',
  16.       age: 18,
  17.       address: '衡水市'
  18.     }
  19.   }
  20.   // add方法,会返回一个执行对象,可以监听到成功或者失败
  21.   const flag = store.add(obj)
  22.   flag.onsuccess = function (event) {
  23.     console.log('新增数据-成功!')
  24.   }
  25.   flag.onerror = function (event) {
  26.     console.log('新增数据-失败!')
  27.   }
  28. })
  29. // 修改数据时
  30. const updateUserData(id)=>{
  31.   // 创建一个事务,找对应的对象存储做对应的操作
  32.   const transaction = db.transaction(['UserStore'], 'readwrite')
  33.   // 获取具体你要操作的对象存储
  34.   const store = transaction.objectStore('UserStore')
  35.   // add方法,会返回一个执行对象,可以监听到成功或者失败
  36.   const flag = store.get(1) // 主键为1,非索引!!!
  37.   flag.onsuccess = function (event) {
  38.     console.log('获取数据-成功!')
  39.     // 获取到具体的数据
  40.     const data = event.target.result
  41.     data.userData.name = '爱喝水的人'
  42.     // data中是有主键userId的,所以put时直接传入data就可以被数据库知道具体是修改的哪条数据
  43.     const flag2 = store.put(data)
  44.     flag2.onsuccess = function (event) {
  45.       console.log('修改数据-成功!')
  46.     }
  47.     flag2.onerror = function (event) {
  48.       console.error('修改数据-失败!')
  49.     }
  50.   }
  51.   flag.onerror = function (event) {
  52.     console.error('获取数据-失败!')
  53.   }
  54. }
  55. const updateBtn = document.querySelector('.updateUser')
  56. updateBtn.addEventListener('click',updateUserData(1))
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4