## 第六节:IDBObjectStore 对象
IDBObjectStore 对象对应一个对象仓库(object store)。`IDBDatabase.createObjectStore()`方法返回的就是一个 IDBObjectStore 对象。
IDBDatabase 对象的`transaction()`返回一个事务对象,该对象的`objectStore()`方法返回 IDBObjectStore 对象,因此可以采用下面的链式写法。
~~~
db.transaction(['test'], 'readonly')
.objectStore('test')
.get(X)
.onsuccess = function (e) {}
~~~
## 一、属性
IDBObjectStore 对象有以下属性。
* `IDBObjectStore.indexNames`:返回一个类似数组的对象(DOMStringList),包含了当前对象仓库的所有索引。
* `IDBObjectStore.keyPath`:返回当前对象仓库的主键。
* `IDBObjectStore.name`:返回当前对象仓库的名称。
* `IDBObjectStore.transaction`:返回当前对象仓库所属的事务对象。
* `IDBObjectStore.autoIncrement`:布尔值,表示主键是否会自动递增。
## 二、方法
IDBObjectStore 对象有以下方法。
### (1)IDBObjectStore.add()
`IDBObjectStore.add()`用于向对象仓库添加数据,返回一个 IDBRequest 对象。该方法只用于添加数据,如果主键相同会报错,因此更新数据必须使用`put()`方法。
~~~
objectStore.add(value, key)
~~~
该方法接受两个参数,第一个参数是键值,第二个参数是主键,该参数可选,如果省略默认为`null`。
创建事务以后,就可以获取对象仓库,然后使用`add()`方法往里面添加数据了。
~~~
var db;
var openRequest = window.indexedDB.open('demo', 1);
openRequest.onsuccess = function (event) {
db = openRequest.result;
var transaction = db.transaction(['items'], 'readwrite');
transaction.oncomplete = function (event) {
console.log('transaction success');
};
transaction.onerror = function (event) {
console.log('transaction error: ' + transaction.error);
};
var objectStore = transaction.objectStore('items');
var objectStoreRequest = objectStore.add({ foo: 1 });
objectStoreRequest.onsuccess = function (event) {
console.log('add data success');
};
};
~~~
### (2)IDBObjectStore.put()
`IDBObjectStore.put()`方法用于更新某个主键对应的数据记录,如果对应的键值不存在,则插入一条新的记录。该方法返回一个 IDBRequest 对象。
~~~
objectStore.put(item, key)
~~~
该方法接受两个参数,第一个参数为新数据,第二个参数为主键,该参数可选,且只在自动递增时才有必要提供,因为那时主键不包含在数据值里面。
### (3)IDBObjectStore.clear()
`IDBObjectStore.clear()`删除当前对象仓库的所有记录。该方法返回一个 IDBRequest 对象。
~~~
objectStore.clear()
~~~
该方法不需要参数。
### (4)IDBObjectStore.delete()
`IDBObjectStore.delete()`方法用于删除指定主键的记录。该方法返回一个 IDBRequest 对象。
~~~
objectStore.delete(Key)
~~~
该方法的参数为主键的值。
### (5)IDBObjectStore.count()
`IDBObjectStore.count()`方法用于计算记录的数量。该方法返回一个 IDBRequest 对象。
~~~
IDBObjectStore.count(key)
~~~
不带参数时,该方法返回当前对象仓库的所有记录数量。如果主键或 IDBKeyRange 对象作为参数,则返回对应的记录数量。
### (6)IDBObjectStore.getKey()
`IDBObjectStore.getKey()`用于获取主键。该方法返回一个 IDBRequest 对象。
~~~
objectStore.getKey(key)
~~~
该方法的参数可以是主键值或 IDBKeyRange 对象。
### (7)IDBObjectStore.get()
`IDBObjectStore.get()`用于获取主键对应的数据记录。该方法返回一个 IDBRequest 对象。
~~~
objectStore.get(key)
~~~
### (8)IDBObjectStore.getAll()
`DBObjectStore.getAll()`用于获取对象仓库的记录。该方法返回一个 IDBRequest 对象。
~~~
// 获取所有记录
objectStore.getAll()
// 获取所有符合指定主键或 IDBKeyRange 的记录
objectStore.getAll(query)
// 指定获取记录的数量
objectStore.getAll(query, count)
~~~
### (9)IDBObjectStore.getAllKeys()
`IDBObjectStore.getAllKeys()`用于获取所有符合条件的主键。该方法返回一个 IDBRequest 对象。
~~~
// 获取所有记录的主键
objectStore.getAllKeys()
// 获取所有符合条件的主键
objectStore.getAllKeys(query)
// 指定获取主键的数量
objectStore.getAllKeys(query, count)
~~~
### (10)IDBObjectStore.index()
`IDBObjectStore.index()`方法返回指定名称的索引对象 IDBIndex。
~~~
objectStore.index(name)
~~~
有了索引以后,就可以针对索引所在的属性读取数据。
~~~
var t = db.transaction(['people'], 'readonly');
var store = t.objectStore('people');
var index = store.index('name');
var request = index.get('foo');
~~~
上面代码打开对象仓库以后,先用`index()`方法指定获取`name`属性的索引,然后用`get()`方法读取某个`name`属性(`foo`)对应的数据。如果`name`属性不是对应唯一值,这时`get()`方法有可能取回多个数据对象。另外,`get()`是异步方法,读取成功以后,只能在`success`事件的监听函数中处理数据。
### (11)IDBObjectStore.createIndex()
`IDBObjectStore.createIndex()`方法用于新建当前数据库的一个索引。该方法只能在`VersionChange`监听函数里面调用。
~~~
objectStore.createIndex(indexName, keyPath, objectParameters)
~~~
该方法可以接受三个参数。
* indexName:索引名
* keyPath:主键
* objectParameters:配置对象(可选)
第三个参数可以配置以下属性。
* unique:如果设为`true`,将不允许重复的值
* multiEntry:如果设为`true`,对于有多个值的主键数组,每个值将在索引里面新建一个条目,否则主键数组对应一个条目。
假定对象仓库中的数据记录都是如下的`person`类型。
~~~
var person = {
name: name,
email: email,
created: new Date()
};
~~~
可以指定这个对象的某个属性来建立索引。
~~~
var store = db.createObjectStore('people', { autoIncrement: true });
store.createIndex('name', 'name', { unique: false });
store.createIndex('email', 'email', { unique: true });
~~~
上面代码告诉索引对象,`name`属性不是唯一值,`email`属性是唯一值。
### (12)IDBObjectStore.deleteIndex()
`IDBObjectStore.deleteIndex()`方法用于删除指定的索引。该方法只能在`VersionChange`监听函数里面调用。
~~~
objectStore.deleteIndex(indexName)
~~~
### (13)IDBObjectStore.openCursor()
`IDBObjectStore.openCursor()`用于获取一个指针对象。
~~~
IDBObjectStore.openCursor()
~~~
指针对象可以用来遍历数据。该对象也是异步的,有自己的`success`和`error`事件,可以对它们指定监听函数。
~~~
var t = db.transaction(['test'], 'readonly');
var store = t.objectStore('test');
var cursor = store.openCursor();
cursor.onsuccess = function (event) {
var res = event.target.result;
if (res) {
console.log('Key', res.key);
console.dir('Data', res.value);
res.continue();
}
}
~~~
监听函数接受一个事件对象作为参数,该对象的`target.result`属性指向当前数据记录。该记录的`key`和`value`分别返回主键和键值(即实际存入的数据)。`continue()`方法将光标移到下一个数据对象,如果当前数据对象已经是最后一个数据了,则光标指向`null`。
`openCursor()`方法的第一个参数是主键值,或者一个 IDBKeyRange 对象。如果指定该参数,将只处理包含指定主键的记录;如果省略,将处理所有的记录。该方法还可以接受第二个参数,表示遍历方向,默认值为`next`,其他可能的值为`prev`、`nextunique`和`prevunique`。后两个值表示如果遇到重复值,会自动跳过。
### (14)IDBObjectStore.openKeyCursor()
`IDBObjectStore.openKeyCursor()`用于获取一个主键指针对象。
~~~
IDBObjectStore.openKeyCursor()
~~~
- 第一章:音视频
- 第一节:概述
- 第二节:媒体元素
- 第三节:视频元素
- 第四节:音频元素
- 第四节:事件
- 第二章:高德地图
- 第三章:Storage 接口
- 第一节:概述
- 第二节:属性和方法
- 第三节:事件
- 第四章:IndexedDB
- 第一节:概述
- 第二节:基本概念
- 第三节:indexedDB 对象
- 第四节:IDBRequest 对象
- 第五节:IDBDatabase 对象
- 第六节:IDBObjectStore 对象
- 第七节:IDBTransaction 对象
- 第八节:IDBIndex 对象
- 第九节:IDBCursor 对象
- 第十节:IDBKeyRange 对象
- 第十一节:操作流程
- 第五章:Canvas
- 第一节:概述
- 第二节:绘制图像
- 第一课时:路径
- 第二课时:线型
- 第三课时:矩形
- 第四课时:弧线
- 第五课时:文本
- 第六课时:渐变色和图像填充
- 第七课时:阴影
- 第三节:图像处理
- 第一课时:写入图像
- 第二课时:像素读写
- 第三课时:保存和恢复
- 第四课时:画布
- 第五课时:图像变换
- 第四节:元素方法
- 第一课时:toDataURL()
- 第二课时:toBlob()
- 第五节:使用实例
- 第一课时:动画效果
- 第二课时:像素处理