IndexedDB基本概念

控制台

  • IndexedDB下为数据库
  • 数据库下为表,表内容展示为主键值和其他值,其中其他值包括索引和其余任意字段,以对象形式表现
  • 表下为索引字段表,用来展示拥有同一种索引字段的全部数据(有多少种索引就会有多少张对应的表)
  • 控制台显示会有不一样步现象,当可能有出入时会有黄色感叹号提醒,能够经过刷新当前数据库得到最新状态

——————————————————————————————————————————————————————————

IndexedDB概况

  • indexedDB也听从同源协议
  • API包含异步(asynchronous) API 和同步(synchronous)API两种。 异步API适合大多数状况, 同步API必须同 WebWorkers一同使用. 目前,没有主流浏览器支持同步API。
  • IndexedDB 是key-value型数据库(简单好使)

基本概念

  • IndexedDB 数据库使用 key-value 键值对储存数据。key能够是二进制对象。
  • IndexedDB API提供了索引(indexes)、表(tables)、指针(cursors)等等
  • 事务(transaction)有生存周期,在生存周期之后使用它会报错。而且,事务(transaction)是自动提交的,不能够手动提交。
  • 事务是为了不异步操做可能产生的读写冲突
  • IndexedDB在结果准备好以后经过DOM事件通知用户 DOM事件老是有一个类型(type)属性(在IndexedDB中,该属性一般设置为success或error)。DOM事件还有一个目标(target)属性,用来告诉事件是被谁触发的。一般状况下,目标(target)属性是数据库操做生成的IDBRequest。成功(success)事件不弹出提示而且不能撤销,错误(error)事件会弹出提示且能够撤销。这一点是很是重要的,由于除非错误事件被撤销,不然他们会终止所在的任何事务。
  • IndexedDB是面向对象的。(能够根据储存的对象类型在同一张表中创建不一样的索引进行区分)

名词解释

数据库

  • 当操做系统被告知去写入数据后 IDBTransaction.oncomplete 事件被触发(若是操做系统崩溃或在数据被写入磁盘前断电,那么整个事务都将丢失)
  • 对象仓库中的的数据以 keys 升序排列。(根据主键排序?)
  • 对象存储能够有一个 key generator 和一个 key path。若是对象仓库有 key path,则使用 in-line keys; 不然使用 out-of-line keys
    • 键生成器(key generator)自动递增添加主键
    • 键路径(key path)一个合法的键路径能够是如下形式:一个空字符串,一个 JavasScript 标识符,或由句点分割的多个 JavaScript 标识符。但不能包括空格。(主键)
    • 内键(in-line key)做为存储值一部分的键。(主键和其余值都被一块儿保存在value中)
    • 外键(out-of-line key)与值分开存储的键。
  • 一个比当前版本号更高的值去打开数据库。这会开启一个 VERSION_CHANGE 事务而且触发 upgradeneeded 事件。只有在该事件的处理函数中才能更新数据库模式。
  • 一个给定的数据库能够同时拥有多个链接。
  • 任何对于数据库中的数据读和修改的操做只能在事务中进行
  • 一个数据库链接能够拥有多个与之关联的事务,只要进行写操做事务的做用域不相互重合。事务的做用域在事务被建立时就被肯定,指定事务可以进行交互的对象仓库(object store),做用域一旦被肯定就会在整个生命周期中保持不变。对于读操做的事务,你能够同时拥有多个,即便他们有重叠的做用域。
  • 事务被指望拥有较短的生命周期,因此浏览器会终止一个消耗时间过长的事务,为了释放存储资源,运行太久的事务会被锁定。你能够中断一个事务,来回滚事务中对数据库进行的操做。而且你甚至不须要等待事务开始或激活就能够中断它。(对同一条数据记录全部影响到该数据事务,回滚时执行可以产生反效果的SQL?)
  • 事务有三种模式:读写、只读和版本变动。建立和删除对象仓库(object store)的惟一方法就是经过调用版本变动事务。
  • 由于全部的事情都在事务中发生
  • 索引(index)(一个新的表以索引字段为主键,以被索引表中的主键为值)

键和值

  • 键能够是如下数据类型:字符串、日期、浮点和数组。对于数组,键的取值能够从空数组到无穷。而且你可使用嵌套数组。
  • 值能够包含任何 JavaScript 表达式,包括:布尔、数字、字符串、日期、对象、数组、正则、未定义和 null。
  • 主键(key)是默认创建索引的属性。好比,数据记录是{ id: 1, name: '张三' },那么id属性能够做为主键。主键也能够指定为下一层对象的属性,好比{ foo: { bar: 'baz' } }的foo.bar也能够指定为主键。

范围和做用域

  • 游标(cursor)在键的某个范围内迭代查询多条记录的机制。游标有一个指向正在被迭代的对象仓库或索引的源。它处于该范围内的一个位置,并按照键的顺序正向或逆向的移动。

局限性

  • 全文搜索。IndexedDB 接口没有相似 SQL 语句中 LIKE 的功能。

————————————————————————————————————————————————————————

IndexedDB

  • IndexedDB 在 Web Worker 中可用

接口

  • 在window对象的indexedDB属性上调用open()方法。该方法返回一个 IDBRequest对象
  • 异步操做经过在 IDBRequest对象上触发事件来和调用程序进行通讯
  • IDBRequest 处理数据库请求并提供对结果访问的通用接口。(全部异步操做的继承类?)
  • IDBFactory 提供数据库访问。这是全局对象indexedDB实现的接口,所以是API的入口。(indexedDB的父类?)

链接数据库

  • IDBOpenDBRequest 表示一个打开数据库的请求。
var DBOpenRequest = window.indexedDB.open("toDoList", 4);

DBOpenRequest.onerror = function(event) {
  
};

DBOpenRequest.onsuccess = function(event) {
  
};

DBOpenRequest.onupgradeneeded = function(event) { // 升级、新建版本

}
  • IDBDatabase 表示一个数据库链接。这是在数据库中获取交易的惟一方式。(用来修改表结构(添加删除表,修改索引等)或者获取事务)
var DBOpenRequest = window.indexedDB.open("toDoList", 4);

DBOpenRequest.onsuccess = function(event) {

    db = DBOpenRequest.result; // IDBDatabase 应该是指这个

  };

接收和修改数据

  • IDBTransaction 表示一个交易。在数据库上建立一个交易,指定做用域(例如要访问的存储对象),并肯定所需的访问类型(只读或读写)。事务对象提供error、abort和complete三个事件,用来监听操做结果。
    • 写入数据须要新建一个事务。新建时必须指定表格名称和操做模式("只读"或"读写")
// 应该是指一个交易(事务)
var trans1 = db.transaction("foo", "readwrite");
  • IDBObjectStore 表示容许访问经过主键查找的IndexedDB数据库中的一组数据的对象存储区。(经过事务得到,表明对象仓库)
var objectStore1 = trans1.objectStore("foo")

objectStore1.put("1", "key");
  • IDBCursor 迭代对象存储和索引。(指针对象)
function readAll() {
  var objectStore = db.transaction('person').objectStore('person');

   objectStore.openCursor().onsuccess = function (event) {
     var cursor = event.target.result;

     if (cursor) {
       console.log('Id: ' + cursor.key);
       console.log('Name: ' + cursor.value.name);
       console.log('Age: ' + cursor.value.age);
       console.log('Email: ' + cursor.value.email);
       cursor.continue();
    } else {
      console.log('没有更多数据了!');
    }
  };
}

readAll();
  • IDBIndex 也是为了容许访问IndexedDB数据库中的数据子集,但使用索引来检索记录而不是主键。这有时比使用IDBObjectStore更快。
var transaction = db.transaction(['person'], 'readonly');
var store = transaction.objectStore('person');
var index = store.index('name');
var request = index.get('李四');

request.onsuccess = function (e) {
  var result = e.target.result;
  if (result) {
    // ...
  } else {
    // ...
  }
}
  • IDBCursorWithValue 迭代对象存储和索引并返回游标的当前值。
// 缺乏
  • IDBKeyRange 定义可用于从特定范围内的数据库检索数据的键范围。(主键集合)
var keyRangeValue = IDBKeyRange.bound("A", "F"); // IDBKeyRange用于建立检索范围

  var transaction = db.transaction(['fThings'], 'readonly');
  var objectStore = transaction.objectStore('fThings');

  objectStore.openCursor(keyRangeValue).onsuccess = function(event) {...}

自定义事件接口

  • IDBVersionChangeEvent 做为IDBOpenDBRequest.onupgradeneeded事件的处理程序的结果(做为事件参数得到)
相关文章
相关标签/搜索