共计 3332 个字符,预计需要花费 9 分钟才能阅读完成。
IndexedDB 数据库
特点如下
- 键值对存储 每一条记录有对应的主键 主键是举世无双的
- 异步 这与 localStorage 造成鲜明对比
- 反对事务 反对回滚操作
- 同源限度 不能拜访跨源数据库
- 贮存空间大 个别不少于 250MB
- 反对二进制存储 例如 ArrayBuffer 和 Blob 对象
数据库对象 IDBDatabase 仓库 IDBObjectStore 索引 IDBIndex 事务 IDBTransaction 操作申请 IDBRequest 指针 IDBCursor 主键汇合 IDBKeyRange
操作流程
关上数据库
`var request = window.indexedDB.open(databaseName, version);
`
数据库关上返回函数
1.error 事件
request.onerror = function (event) {console.log('数据库关上报错');
};
2.success 事件
var db;
request.onsuccess = function (event) {
db = request.result;
console.log('数据库关上胜利');
};
3.upgradeneeded 事件 数据库降级事件
var db;
request.onupgradeneeded = function (event) {db = event.target.result;}
新建数据库
新建数据库并创立 person 表 主键为 id
request.onupgradeneeded = function(event) {
db = event.target.result;
var objectStore;
if (!db.objectStoreNames.contains('person')) {objectStore = db.createObjectStore('person', { keyPath: 'id'});
}
}
主动生成主键
var objectStore = db.createObjectStore(
'person',
{autoIncrement: true}
);
IDBObject.createIndex()的三个参数别离为索引名称、索引所在的属性、配置对象(阐明该属性是否蕴含反复的值)。
request.onupgradeneeded = function(event) {
db = event.target.result;
var objectStore = db.createObjectStore('person', { keyPath: 'id'});
objectStore.createIndex('name', 'name', { unique: false});
objectStore.createIndex('email', 'email', { unique: true});
}
新增数据
新增数据是向数据库写入数据记录,须要通过事务实现
function add() {var request = db.transaction(['person'], 'readwrite')
.objectStore('person')
.add({id: 1, name: '张三', age: 24, email: 'zhangsan@example.com'});
request.onsuccess = function (event) {console.log('数据写入胜利');
};
request.onerror = function (event) {console.log('数据写入失败');
}
}
add();
写入数据须要新建一个事务,新建时必须指定表格名称和操作模式(只读或者读写)。新建事务当前,通过 IDBTransaction.objectStore(name) 办法,拿到 IDBObjectStore 对象,在通过表格对象的 add() 办法,向表格写入记录,因为是异步操作,须要监听连贯对象的 success 和 error 事件
读取数据
function read() {var transaction = db.transaction(['person']);
var objectStore = transaction.objectStore('person');
var request = objectStore.get(1);
request.onerror = function(event) {console.log('事务失败');
};
request.onsuccess = function(event) {if (request.result) {console.log('Name:' + request.result.name);
console.log('Age:' + request.result.age);
console.log('Email:' + request.result.email);
} else {console.log('未取得数据记录');
}
};
}
read();
objectStore.get() 办法用来读取数据,参数是主键的值
遍历数据
应用指针对象 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();
新建指针对象的 openCursor()办法是一个异步操作,须要监听 success 事件
更新数据
应用 IDBObject.put() 办法
function update() {var request = db.transaction(['person'], 'readwrite')
.objectStore('person')
.put({id: 1, name: '李四', age: 35, email: 'lisi@example.com'});
request.onsuccess = function (event) {console.log('数据更新胜利');
};
request.onerror = function (event) {console.log('数据更新失败');
}
}
update();
删除数据
IDBObjectStore.delete() 办法用于删除记录
function remove() {var request = db.transaction(['person'], 'readwrite')
.objectStore('person')
.delete(1);
request.onsuccess = function (event) {console.log('数据删除胜利');
};
}
remove();
应用索引
应用索引的意义在于 能够让你搜寻任意字段,如果不建设索引,默认只能搜寻主键
假如新建表格的时候,对 name 字段建设了索引
`objectStore.createIndex(‘name’, ‘name’, { unique: false});
`
当初 就能够从 name 找到对应的数据记录了
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 {// ...}
}