博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5:离线存储(缓存机制)-IndexDB
阅读量:5031 次
发布时间:2019-06-12

本文共 5543 字,大约阅读时间需要 18 分钟。

https://www.w3.org/TR/IndexedDB/

 ..

    
姓名: 电话: 地址:
姓名 电话 地址 删除

 

http://www.myexception.cn/nosql/1973758.htmlhtml5之indexdb(nosql存储)indexedDB是HTML5-WebStorage的重要一环,是一种轻量级NOSQL数据库。相比web sql(sqlite)更加高效,包括索引、事务处理和健壮的查询功能。indexedDB特点:一个网站可能有一个或多个 IndexedDB 数据库,每个数据库必须具有惟一的名称。一个数据库可包含一个或多个对象存储。一个对象存储(由一个名称惟一标识)是一个记录集合。每个记录有一个键 和一个值。该值是一个对象,可拥有一个或多个属性。键可能基于某个键生成器,从一个键路径衍生出来,或者是显式设置。一个键生成器自动生成惟一的连续正整数。键路径定义了键值的路径。它可以是单个 JavaScript 标识符或多个由句点分隔的标识符。(有点像列数据库的特点)IndexedDB中,几乎所有的操作都是采用了command->request->result的方式。比如查询一条记录,返回一个request,在request的result中得到查询结果。又比如打开数据库,返回一个request,在request的result中得到返回的数据库引用。indexedDB需要放到web服务器上才可以运行。1、indexedDB常用方法:1)获得indexedDB对象:(这一步相当于传统数据库中的创建数据库)if (!window.indexedDB) {      window.indexedDB = window.mozIndexedDB || window.webkitIndexedDB;  }  request.onupgradeneeded = function(event) {  alert(event.oldVersion);  db = request.result;  if (db.objectStoreNames.contains('books')) {      db.deleteObjectStore('books');  }  var store = db.createObjectStore("books", {keyPath: "isbn"});  var titleIndex = store.createIndex("by_title", "title", {unique: true});  var authorIndex = store.createIndex("by_author", "author");  // Populate with initial data.  store.put({title: "Quarry Memories", author: "Fred", isbn: 123456,other:"..ceshi...."});  store.put({title: "Water Buffaloes", author: "Fred", isbn: 234567});  store.put({title: "Bedrock Nights", author: "Barney", isbn: 3456780000000000000});};var request = indexedDB.open("MyTestDatabase");  request.onsuccess = function(e) {      var db = request.result;  } 注:indexedDB标准建议,在初始化的时候创建表。以后每次打开浏览器,只需要check版本号,不需要第二次创建。(只有当版本变化或者第一次时采调用onupgradeneeded方法)2)初始化objectStore:(相当于传统数据库中的表)request.onupgradeneeded = function(event) {  alert(event.oldVersion);  db = request.result;  if (db.objectStoreNames.contains('books')) {      db.deleteObjectStore('books');  }  var store = db.createObjectStore("books", {keyPath: "isbn"});  var titleIndex = store.createIndex("by_title", "title", {unique: true});  var authorIndex = store.createIndex("by_author", "author");  // Populate with initial data.  store.put({title: "Quarry Memories", author: "Fred", isbn: 123456,other:"..ceshi...."});  store.put({title: "Water Buffaloes", author: "Fred", isbn: 234567});  store.put({title: "Bedrock Nights", author: "Barney", isbn: 3456780000000000000});};注:1.在indexedDB中,类似列数据库,所以没有列的概念,存储的是无层次限制的json对象。2.可以通过index创建索引。3)事务、游标1.在indexedDB中,事务会自动提交或回滚。所以无需手动commit或者rollback。事务分为三种IDBTransaction.READ_ONLY              只读IDBTransaction.READ_WRITE            可读可写IDBTransaction.VERSION_CHANGE    版本升级我们用的最多的是前两种。如果不设置事务级别,则默认为READ_ONLY。2.游标,是遍历object store的唯一方法。如果在打开游标的时候不设置,默认采用IDBCursor.NEXT。在调用了cursor.continue之后,cursor会重新调用onsuccess句柄上的方法。// 通过IDBDatabase得到IDBTransaction  var transaction = db.transaction(["customers"]);    // 通过IDBTransaction得到IDBObjectStore  var objectStore = transaction.objectStore("customers");    // 打开游标,遍历customers中所有数据  objectStore.openCursor().onsuccess = function(event) {                    var cursor = event.target.result;                    if (cursor) {          var key = cursor.key;          var rowData = cursor.value;          alert(rowData.name);          cursor.continue();      }  }  4)索引查询:上例中的objectStore.openCursor是根据keyPath去查询的。如果想通过某个索引去查询,可以用objectStore.index(索引名).openCursor去查询1)openCursor的第一个参数为查询条件,他需要传入一个IDBKeyRange对象。IDBKeyRange的创建方式有4种,都是调用了IDBKeyRange的静态方法。分别代表了4种不同类型的条件。// 只取得当前索引的值为Bill的数据  IDBKeyRange.only("Bill");    // 只取得当前索引的值大于Bill,并且不包括Bill的数据  IDBKeyRange.lowerBound("Bill", true);    // 只取得当前索引的值小于Bill,并且包括Bill的数据  IDBKeyRange.upperBound("Bill", false);    // 取得当前索引的值介于Bill和Jack之间,并且包括Bill,但不包括Jack的数据  IDBKeyRange.bound("Bill", "Jack", false, true);   2)openCursor的第二个参数为游标方向。有4种IDBCursor.NEXT                                  顺序循环IDBCursor.NEXT_NO_DUPLICATE        顺序循环不重复IDBCursor.PREV                                  倒序循环IDBCursor.PREV_NO_DUPLICATE        倒序循环不重复var boundKeyRange = IDBKeyRange.upperBound("Jack", false);  objectStore.index("name").openCursor(boundKeyRange, IDBCursor.PREV_NO_DUPLICATE).onsuccess = function(event) {          var cursor = event.target.result;                    if (!cursor) {              return;          }                    var rowData = cursor.value;                    alert(rowData.name);          cursor.continue();      }; 2、实例:indexdb demo...

 

 

  IndexedDB 是一个为了能够在客户端存储可观数量的结构化数据,并且在这些数据上使用索引进行高性能检索的 API。虽然 DOM 存储 对于存储少量数据是非常有用的,但是它对大量结构化数据的存储就显得力不从心了。IndexedDB 则提供了这样的一个解决方案。   IndexedDB 分别为同步和异步访问提供了单独的 API 。同步 API 本来是要用于仅供 Web Workers 内部使用,但是还没有被任何浏览器所实现。异步 API 在 Web Workers 内部和外部都可以使用,另外浏览器可能对indexDB有50M大小的限制,一般用户保存大量用户数据并要求数据之间有搜索需要的场景。

  • 异步API

  异步 API 方法调用完后会立即返回,而不会阻塞调用线程。要异步访问数据库,要调用 window 对象 indexedDB 属性的 open() 方法。该方法返回一个 IDBRequest 对象 (IDBOpenDBRequest);异步操作通过在 IDBRequest 对象上触发事件来和调用程序进行通信。

- IDBFactory 提供了对数据库的访问。这是由全局对象 indexedDB 实现的接口,因而也是该 API 的入口。- IDBCursor 遍历对象存储空间和索引。- IDBCursorWithValue 遍历对象存储空间和索引并返回游标的当前值。- IDBDatabase 表示到数据库的连接。只能通过这个连接来拿到一个数据库事务。- IDBEnvironment 提供了到客户端数据库的访问。它由 window 对象实现。- IDBIndex 提供了到索引元数据的访问。- IDBKeyRange 定义键的范围。- IDBObjectStore 表示一个对象存储空间。- IDBOpenDBRequest 表示一个打开数据库的请求。-IDBRequest 提供了到数据库异步请求结果和数据库的访问。这也是在你调用一个异步方法时所得到的。- IDBTransaction 表示一个事务。你在数据库上创建一个事务,指定它的范围(例如你希望访问哪一个对象存储空间),并确定你希望的访问类型(只读或写入)。- IDBVersionChangeEvent 表明数据库的版本号已经改变。
  • 同步API

  规范里面还定义了 版本。同步 API 还没有在任何浏览器中得以实现。它原本是要和  一起使用的。

 

  

 

转载于:https://www.cnblogs.com/leee/p/5292409.html

你可能感兴趣的文章
CCP浅谈
查看>>
NAT虚拟网络配置
查看>>
c#部分---需要实例化的内容;
查看>>
技术项目,问题
查看>>
线程池总结
查看>>
Learning to rank (software, datasets)
查看>>
git常见问题
查看>>
.NETFramework:template
查看>>
HM16.0之帧内模式——xCheckRDCostIntra()函数
查看>>
Jmeter性能测试 入门
查看>>
安卓动画有哪几种?他们的区别?
查看>>
Nodejs学习总结 -Express入门(一)
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
Web项目中的路径问题
查看>>