当前位置:   article > 正文

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

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

IndexedDB

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

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

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

代码和结果

  1. // 浏览器本地数据库
  2. // console.log(indexedDB);
  3. // indexedDB结构:
  4. // 数据库(库)->对象库(表)->存储的数据(key/value)
  5. // indexedDB下可以有多个数据库,每个数据库下可以有多个对象库
  6. // 数据库可以有许多不同的名称,但是必须存在于当前的源(域/协议/端口)中。不同的网站不能相互访问对方的数据库。
  7. let dbName = "test";
  8. // 打开\创建一个数据库(若原数据库版本低,则更新;若原数据库版本高,则保持)
  9. let request = indexedDB.open(dbName,7);// 数据库的名称 string,版本号 number默认为1
  10. let db ;// 打开数据库成功后存放数据库对象
  11. console.log(request);
  12. // 数据库已准备就绪,当尝试打开版本号高于其当前版本的数据库时,将触发该事件(更新)
  13. // 在 upgradeneeded 处理程序中,只有在创建数据库版本时,对象库被才能被 创建/修改。这表示要对对象库操作需要更新一次版本
  14. request.onupgradeneeded = (e)=>{
  15. console.log(e);// 数据库中的内容
  16. db = request.result;
  17. // 创建存储库对象
  18. let store = "user"; // 存储对象库名
  19. let keyOptions = {
  20. keyPath : "id",// 主键,访问存储对象的属性路径,例如id,这表示存储的数据属性中必须要有id属性
  21. autoIncrement: false // autoIncrement为true,则自动生成新存储的对象的键,键是一个不断递增的数字,
  22. }
  23. if (!db.objectStoreNames.contains(store)) { // 如果没有 “user” 数据
  24. // 此方法应该在upgradeneeded事件中执行,否则将报错(应该在upgradneeded事件的回调函数中调用createObjectStore方法创建store object,不应该在success的回调中,否则会报错)
  25. db.createObjectStore(store,keyOptions);
  26. }
  27. delDB(db);
  28. }
  29. // 数据库打开失败
  30. request.onerror = ()=>{
  31. // 如果当前用户的数据库版本比 open 调用的版本更高(比如当前的数据库版本为 3,我们却尝试运行 open(...2),就会产生错误并触发 openRequest.onerror)。
  32. console.log("数据库连接失败"+request.error);
  33. }
  34. // 数据库已就绪
  35. request.onsuccess = ()=>{
  36. console.log("数据库连接成功");// 数据库中的内容
  37. db = request.result;
  38. console.log(db);
  39. // 监听低版本号数据库,触发则关闭数据库
  40. db.onversionchange = function() {
  41. db.close();
  42. console.log("数据库版本低已关闭,请重启页面.")
  43. };
  44. let store = "user"; // 存储对象库名
  45. // add(db,store);
  46. read(db,store)
  47. }
  48. // 数据库操作阻塞时触发
  49. request.onblocked = ()=>{
  50. db.close();
  51. console.log("数据库操作失败已关闭.")
  52. }
  53. // 事务操作存储、删除数据
  54. function add(db,store){
  55. let transaction = db.transaction(store,"readwrite");// 操作user的事务,对其开放读写权限,默认只读readonly
  56. // 获取对象库进行操作
  57. let user = transaction.objectStore(store);
  58. let data = {
  59. id :1,
  60. name : "Tom",
  61. age : 18
  62. }
  63. let addData = user.add(data);
  64. addData.onerror = ()=>{
  65. console.log("数据添加成功"+addData.result);
  66. }
  67. addData.onsuccess = ()=>{
  68. console.log("数据添加失败"+addData.error);
  69. }
  70. }
  71. // 事务操作读取数据
  72. function read(db,store){
  73. let transaction = db.transaction(store,"readwrite");// 操作user的事务,对其开放读写权限,默认只读readonly
  74. // 获取对象库进行操作
  75. let user = transaction.objectStore(store);
  76. let read = user.get(1);
  77. read.onsuccess = ()=>{
  78. console.log(read.result);
  79. };
  80. }
  81. function delDB(db){
  82. db.close();
  83. // 删除这个数据库(需要先关闭才能删除)
  84. indexedDB.deleteDatabase(db.result.name);
  85. }
  86. function delStore(db,name){// 删除一个对象库name
  87. db.deleteObjectStore(name);
  88. }

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

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

IndexedDB (javascript.info)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/543990
推荐阅读
相关标签
  

闽ICP备14008679号