<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>indexedDB(浏览器当地存储数据库)</title>
</head>
<body>
<p>IndexedDB 就是浏览器供应的当地数据库,它能够被网页剧本建立和操纵。</p>
<p>IndexedDB 许可贮存大批数据,供应查找接口,还能竖立索引。</p>
<h3>indexedDB特性</h3>
<ol>
<li>键值对存储:采纳对象堆栈存储数据,一切的数据类型都能够直接存入,主键是举世无双的</li>
<li>异步:</li>
<li>支撑事宜:IndexedDB 支撑事宜(transaction),这意味着一系列操纵步骤当中,只需有一步失利,全部事宜就都作废,数据库回滚到事宜发作之前的状况,不存在只改写一部分数据的状况。</li>
<li>同源限定: IndexedDB 遭到同源限定,每个数据库对应建立它的域名。网页只能接见本身域名下的数据库,而不能接见跨域的数据库。</li>
</ol>
<script>
/**
* databaseName:字符串,示意数据库的名字,不存在则新建
* version :第二个参数是整数,示意数据库的版本。默以为1
* 返回一个 IDBRequest 对象 对象经由过程三种事宜error、success、upgradeneeded
*
* 新建数据库与翻开数据库是同一个操纵。假如指定的数据库不存在,就会新建。不同之处在于,后续的操纵主要在upgradeneeded事宜的监听函数内里完成
*
* 新建数据步骤:
* step1:新建对象堆栈(即新建表
* step2:新建索引
*
* */
//IDBDatabase对象
let db;
//建立或许翻开
let request = window.indexedDB.open('newIDB');
//删除数据库
var DBDeleteRequest = window.indexedDB.deleteDatabase('newIDB');
DBDeleteRequest.onerror = function (event) {
console.log('Error');
};
DBDeleteRequest.onsuccess = function (event) {
console.log('success');
};
//error事宜--示意翻开数据失利
request.onerror = function (event) {
console.log('数据库翻开报错');
db.close();
};
request.success = function (event) {
//经由过程request对象的result属性拿到数据库对象
db = request.result;
console.log(db);
console.log('数据库翻开胜利')
};
console.log(request);
//onupgradeneeded---假如指定的版本号,大于数据库的现实版本号,就会发作数据库晋级事宜
request.onupgradeneeded = function (event) {
//经由过程事宜对象的target.result属性,拿到数据库实例。
console.log(event);
//request对象的result属性上面,拿到一个IDBDatabase对象,它示意衔接的数据库
db = event.target.result;
let objectStore;
// 更好的写发是推断表是不是存在
if (!db.objectStoreNames.contains('newIDB')) {
/**新建数据
* 新建对象堆栈(即新建表)
* 新增一张叫做person的表格,主键是id
* */
//主键(key)是默许竖立索引的属性。假如没有能够让 IndexedDB 自动天生主键db.createObjectStore('person',{ autoIncrement: true })
objectStore = db.createObjectStore('newIDB', {keyPath: 'id'});
/**
* 新建索引
* 三个参数分别为索引称号、索引地点的属性、设置对象(申明该属性是不是包括反复的值)
* **/
objectStore.createIndex('name', 'name', {unique: false});
objectStore.createIndex('email', 'email', {unique: true});
}
};
/**新增数据
* 新增数据指的是向对象堆栈写入数据纪录。这须要经由过程事宜完成。
* 写入数据须要新建一个事宜
* 新建时必需指定表格称号和操纵形式("只读"或"读写")
* 写入操纵是一个异步操纵,经由过程监听衔接对象的success事宜和error事宜,相识是不是写入胜利。
* **/
function add() {
//经由过程IDBTransaction.objectStore(name)要领,拿到 IDBObjectStore 对象,再经由过程表格对象的add()要领,向表格写入一条纪录。
var request = db.transaction(['newIDB'], 'readwrite')
.objectStore('newIDB')
.add({id: 1, name: '张三', age: 24, email: 'zhangsan@example.com'});
request.onsuccess = function (event) {
console.log('数据写入胜利');
};
request.onerror = function (event) {
console.log('数据写入失利');
}
}
setTimeout(function () {
console.log(db);
add();
}, 2000);
/** 读取数据
*
*读取数据也是经由过程事宜完成。
*
*
* **/
function read() {
//建立是务
let transaction = db.transaction(['newIDB']);
//拿到 IDBObjectStore 对象
let objectStore = transaction.objectStore('newIDB');
//objectStore.get()要领用于读取数据,参数是主键的值。
let request = objectStore.get(1);
//失利监听
request.onerror = function (event) {
console.log('事宜失利');
db.close()
};
//胜利监听
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('未获得数据纪录');
}
};
}
setTimeout(function () {
read();
}, 4000);
/**遍历数据
*遍历数据表格的一切纪录,要运用指针对象 IDBCursor。
*
* */
function readAll() {
let objectStore = db.transaction('newIDB').objectStore('newIDB');
//新建指针对象的openCursor()要领是一个异步操纵,所以要监听success事宜。
objectStore.openCursor().onsuccess = function (event) {
let 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('没有更多数据了!');
}
};
}
setTimeout(function () {
readAll();
}, 6000);
/**跟新数据
*更新数据要运用IDBObject.put()要领。
*
* */
function update() {
//put()要领自动更新了主键为1的纪录。
let request = db.transaction(['newIDB'], 'readwrite')
.objectStore('newIDB')
.put({id: 1, name: '李四', age: 35, email: 'lisi@example.com'});
request.onsuccess = function (event) {
console.log('数据更新胜利');
};
request.onerror = function (event) {
console.log('数据更新失利');
db.close();
}
}
setTimeout(function () {
update();
}, 8000);
/**删除数据
*IDBObjectStore.delete()要领用于删除纪录
*
* **/
function remove() {
let request = db.transaction(['newIDB'], 'readwrite')
.objectStore('newIDB')
.delete(1);
request.onsuccess = function (event) {
console.log('数据删除胜利');
};
}
// remove();
/**运用索引
* 索引的意义在于,能够让你搜刮恣意字段,也就是说从恣意字段拿到数据纪录。假如不竖立索引,默许只能搜刮主键(即从主键取值)。
* */
function search() {
let request = db.transaction(['newIDB'], 'readonly')
.objectStore('newIDB')
.index('name')
.get('李四');
request.onsuccess = function (e) {
var result = e.target.result;
if (result) {
console.log('搜刮胜利')
} else {
console.log('搜刮失利')
}
}
}
// search();
</script>
</body>
</html>
**注重:运用的时刻链接数据库,失利或许完成其他操纵封闭数据库;**
indexedDB存储
原文作者:javascriptMen
原文地址: https://segmentfault.com/a/1190000018643627
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://segmentfault.com/a/1190000018643627
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。