0
点赞
收藏
分享

微信扫一扫

如何使用indexdb

云朵里的佛光 2022-08-18 阅读 61


 

 

 

一、实现步骤

 

1)获得indexedDB对象

if (!window.indexedDB) {
window.indexedDB = window.mozIndexedDB || window.webkitIndexedDB || window.msIndexDB; //webkit是chrome
}

 

 

2)打开数据库   

var openDBRequest = indexedDB.open("person",3);        //第二个参数为版本
var openDBRequest = indexedDB.open("dev");

 由于事件执行的顺序问题,打开数据库open方法一定是放在window.onload = function(){} 或都其它事件函数之外

 

3)创建主键、索引

request.onupgradeneeded = function(event){     //数据库版本发生变化时先调用这个函数,然后再执行onsuccess
alert(event.oldVersion);
database = request.result;
if (database.objectStoreNames.contains('user')) {
database.deleteObjectStore('user');
}
var store = database.createObjectStore("user", {keyPath: "uuid", autoIncrement: true}); //此处表示将uuid作为主键
  //keyPath 后面的值一定是要存在的属性名,用于标志唯一字段,如果重复则不添加进去,可以是字符串、数值类型等
  //此值也是索引中的 Primary key(keyPath : "uuid")
store.createIndex("idIndex", "id", {unique: true}); //创建索引 (此处的id改为uuid)
  //idIndex 为索引的名称,id 为 索引中的KeyPath,即将id属性中的值作为索引
  //注:如果写成id的话(与上面的keyPath不一至,将不会创建索引,这里将不会创建索引)
var user1 = {uuid :1001, username: "caoxiaobo", password: "123456", age: 23,other:"test"};
var user2 = {uuid :1002, username: "adminuser", password: "123456", age: 24};
var user3 = {uuid :1003, username: "test1user", password: "123456", age: 25}
var req = store.put(user1);
store.put(user2);
store.put(user3);
req.onsuccess = function(){
//...
}
}

 

索引创建规则(只能有一个unique为true)

例:

var store = database.createObjectStore(["user"], {keyPath: "uuid", autoIncrement: true});
store.createIndex("idIndex", "uuid", {unique: true});
store.createIndex('nameIndex','username',{unique: false});
store.createIndex('passwordIndex','password',{unique: false});

4)删除数据库

var deleteRequest = indexedDB.deleteDatabase('test');
deleteRequest.onsuccess = function(){
alert("删除成功");
}
db.deleteObjectStore('books'); //删除数据表

 

 

 

二、常用方法及说明

 

例如:window.indexedDB = window.mozIndexedDB || window.webkitIndexedDB || window.msIndexDB;

返回类型:IDBFactory

接口/属性  

类型

说明

IDBFactory.cmp

方法

比较两个键的方法并返回一个结果,表明哪个值更大

IDBFactory.deleteDatabase

方法

请求删除数据库

IDBFactory.open

方法

请求打开一个数据库的连接,返回类型:IDBOpenDBRequest 

 

 

备注:不管创建新数据库还是打开已有的数据库,都是调用 window.indexedDB 对象的 open() 

 

 

例如:request = indexedDB.open("dev", 3);

返回类型:IDBOpenDBRequest

接口/属性

类型

说明 

IDBOpenDBRequest.onblocked

事件

 

IDBOpenDBRequest.onupgradeneeded 

事件

会在当一个数据库的版本比已经存在的版本还高的时候触发

IDBOpenDBRequest.result

属性

返回一个IDBDatabase对象

IDBOpenDBRequest.transaction

属性

事务的方法,返回一个IDBTransaction对象

 

 

备注: 

1.如果该数据库不存在,则创建,如果存在,则打开并返回一个IDBOpenDBRequest对象;

2.如果version大于oldVersion,则执行onupgradeneeded,再执行onsuccess,否则直接执行onsuccess

 

例如:database = openRequest.result;

返回类型:IDBDatabase

接口名称

类型

说明 

IDBOpenDBRequest.name

属性(只读)

DOMString类型,当前连接数据库名

IDBOpenDBRequest.objectStoreNames 

属性(只读)

DOMStringList类型,当前连接连接数据库中所有的object store 名字列表。 

IDBOpenDBRequest.version 

属性(只读)

64-bit 整型数,当前连接数据库的版本 。当数据第一次被创建时,这个属性是一个空的字符串

IDBOpenDBRequest.onabort

事件

在中断数据库访问时触发

IDBOpenDBRequest.onclose 

事件

在一个单独的线程中关闭数据库连接并立即返回 

IDBOpenDBRequest.onerror 

事件

当访问数据库失败时触发

IDBOpenDBRequest.onversionchange 

事件

当数据库结构发生更改时触发

 

 

例如:transaction = database.transaction(stores, mode);

返回类型:IDBTransaction

接口/属性

 

说明 

IDBTransaction.db

属性(只读)

当前事务所属的数据库连接

IDBTransaction.error  

属性

 

IDBTransaction.mode 

属性(只读)

使用事务模式,如readonly、readwrite等

IDBTransaction.objectStoreNames 

属性

返回一个DOMStringList类型, IDBObjectStore 

IDBTransaction.onabort

事件 

 

IDBTransaction.oncomplate 

事件 

 

IDBTransaction.onerror 

事件 

 

IDBTransaction.onversionchange 

事件 

 

 

事务种类

IDBTransaction.READ_ONLY       readonly     默认

IDBTransaction.READ_WRITE     readwrite

IDBTransaction.VERSION_CHANGE     版本升级

 

例如:store = transaction.ojbectStore(stores);

返回类型:IDBObjectStore 

接口/属性

类型

说明 

IDBObjectStore.autoIncrement 

 

 

IDBObjectStore.indexNames 

属性

使用事务模式

IDBObjectStore.keyPath 

属性

 

IDBObjectStore.name 

属性

 

IDBObjectStore.transaction 

方法

事件的事件处理器 

IDBObjectStore.autoIncrement 

属性

 true/false

 

 

例如:request = store.get(id);

返回类型:IDBRequest

接口/属性

类型

说明 

IDBRequest.error 

属性(只读)

当前事务所属的数据库连接

IDBRequest.onerror 

 

 

IDBRequest.onsuccess 

属性(只读)

使用事务模式

IDBRequest.readyState 

 

返回一个DOMStringList类型, IDBObjectStore 

IDBRequest.result 

 

事件 

IDBRequest.source 

 

事件的事件处理器 

IDBRequest.transaction 

 

事件 

 

三、CRUD操作

 

指定游标范围
openKeyCursor() 等同于openCursor()
IDBKeyRange.only(value) 只获取指定数据
IDBKeyRange.lowerBound(value, isOpen) 获取最小是value的数据,第二个参数用来指示是否排除value值本身,也就是是否关闭区间
IDBKeyRange.upperBound(value, isOpen) 和上面类似,用于获取最大值是value的数据 如果isOpen为true,即为[value, ~)
IDBKeyRange.bound(value1, value2, isOpen1, isOpen2) 查询[value1,value2) 区间内的数据

//第二个参数为游标的方向:
IDBCursor.NEXT 顺序循环
IDBCursor.NEXT_NO_DUPLICATE 顺序循环不重复
IDBCursor.PREV 倒序循环
IDBCursor.PREV_NO_DUPLICATE 倒序循环不重复

 

 

//查询数据
function getData() {
//事务的创建
var tx = database.transaction(["user"], "readonly"); //readwrite readonly
var store = tx.objectStore("user");
var request = store.get(1001);
request.onsuccess = function() {
var user = request.result;
//var user = event.target.result;
console.log(JSON.stringify(user));
};
}

//游标查询所有
function getAllData() {
//事务的创建
var tx = database.transaction(["user"], "readonly"); //readwrite readonly
var store = tx.objectStore("user");
var openCursor = store.openCursor();
openCursor .onsuccess = function() {
var cursor= request.result;
//var cursor = event.target.result;
if(cursor){
console.log(JSON.stringify(cursor.value));
cursor.continue();
}
};
}

//游标+索引查询
function getDataByIndexAndCursor() {
var tx = database.transaction(["user"], "readonly"); //readwrite readonly
var store = tx.objectStore("user");
var index = store.index("nameIndex");
var request = index.openCursor(IDBKeyRange.lowerBound("123"));
//var request = index.openCursor(IDBKeyRange.bound("a","v", false, true)); //区分大小写
request.onsuccess = function() {
var cursor = request.result;
if (cursor) {
console.log(JSON.stringify(cursor.value));
cursor.continue();
}
}
}
//获取记录数
function count() {
var tx = database.transaction(["user"], "readonly");
var store = tx.objectStore("user");
var request = store.count();
request.onsuccess = function() {
var count = request.result;
console.log(count);
}
}
//按索引查询
var findByIndex = function() {
var mode = IDBTransaction.READ_ONLY;
var tx = database.transaction(["user"], "readonly");
var store = tx.objectStore(["user"]);
var index = store.index("idIndex");
var request = index.get(1001);
console.log(request);
request.onsuccess = function() {
var data = request.result;
console.log(JSON.stringify(data));
}
}
//添加数据
function addData(){
var tx = database.transaction(["user"],"readwrite");
var store = tx.objectStore("user");
var user4 = {id:1004, username: "caoxiaobo", password: "123456", age: 23,other:"test"};
var user5 = {id:1005, username: "adminuser", password: "123456", age: 24};
var user6 = {id:1006, username: "test1user", password: "123456", age: 25};
store.put(user4);
store.put(user5);
store.put(user6);
}

//删除数据
function delData(){
var tx = database.transaction(["user"],"readwrite");
var store = tx.objectStore("user");
store.delete(1004);
store.delete(1005);
store.delete(1006);
}

//清空数据
function clearData(){
var tx = database.transaction(["user"],"readwrite");
var store = tx.objectStore("user");
store.clear( );
}

//修改数据
function updata(){
var tx = database.transaction(["user"],"readwrite");
var store = tx.objectStore("user");
var request = store.get(1008);
request.onsuccess = function(event) {
var user = event.target.result;
user.username = "cxb1008";
user.age = 28;
store.put(user);
}
}

一、实现步骤

 

1)获得indexedDB对象

if (!window.indexedDB) {
window.indexedDB = window.mozIndexedDB || window.webkitIndexedDB || window.msIndexDB; //webkit是chrome
}

 

2)打开数据库   

var openDBRequest = indexedDB.open("person",3);        //第二个参数为版本
var openDBRequest = indexedDB.open("dev");

 由于事件执行的顺序问题,打开数据库open方法一定是放在window.onload = function(){} 或都其它事件函数之外

 

3)创建主键、索引

request.onupgradeneeded = function(event){     //数据库版本发生变化时先调用这个函数,然后再执行onsuccess
alert(event.oldVersion);
database = request.result;
if (database.objectStoreNames.contains('user')) {
database.deleteObjectStore('user');
}
var store = database.createObjectStore("user", {keyPath: "uuid", autoIncrement: true}); //此处表示将uuid作为主键
  //keyPath 后面的值一定是要存在的属性名,用于标志唯一字段,如果重复则不添加进去,可以是字符串、数值类型等
  //此值也是索引中的 Primary key(keyPath : "uuid")
store.createIndex("idIndex", "id", {unique: true}); //创建索引 (此处的id改为uuid)
  //idIndex 为索引的名称,id 为 索引中的KeyPath,即将id属性中的值作为索引
  //注:如果写成id的话(与上面的keyPath不一至,将不会创建索引,这里将不会创建索引)
var user1 = {uuid :1001, username: "caoxiaobo", password: "123456", age: 23,other:"test"};
var user2 = {uuid :1002, username: "adminuser", password: "123456", age: 24};
var user3 = {uuid :1003, username: "test1user", password: "123456", age: 25}
var req = store.put(user1);
store.put(user2);
store.put(user3);
req.onsuccess = function(){
//...
}
}

 

索引创建规则(只能有一个unique为true)

例:

var store = database.createObjectStore(["user"], {keyPath: "uuid", autoIncrement: true});
store.createIndex("idIndex", "uuid", {unique: true});
store.createIndex('nameIndex','username',{unique: false});
store.createIndex('passwordIndex','password',{unique: false});

 

4)删除数据库

var deleteRequest = indexedDB.deleteDatabase('test');
deleteRequest.onsuccess = function(){
alert("删除成功");
}
db.deleteObjectStore('books'); //删除数据表

 

 

 

二、常用方法及说明

 

例如:window.indexedDB = window.mozIndexedDB || window.webkitIndexedDB || window.msIndexDB;

返回类型:IDBFactory

接口/属性  

类型

说明

IDBFactory.cmp

方法

比较两个键的方法并返回一个结果,表明哪个值更大

IDBFactory.deleteDatabase

方法

请求删除数据库

IDBFactory.open

方法

请求打开一个数据库的连接,返回类型:IDBOpenDBRequest 


备注:不管创建新数据库还是打开已有的数据库,都是调用 window.indexedDB 对象的 open() 

 

 

例如:request = indexedDB.open("dev", 3);

返回类型:IDBOpenDBRequest

接口/属性

类型

说明 

IDBOpenDBRequest.onblocked

事件

 

IDBOpenDBRequest.onupgradeneeded 

事件

会在当一个数据库的版本比已经存在的版本还高的时候触发

IDBOpenDBRequest.result

属性

返回一个IDBDatabase对象

IDBOpenDBRequest.transaction

属性

事务的方法,返回一个IDBTransaction对象

 

备注: 

1.如果该数据库不存在,则创建,如果存在,则打开并返回一个IDBOpenDBRequest对象;

2.如果version大于oldVersion,则执行onupgradeneeded,再执行onsuccess,否则直接执行onsuccess

 

例如:database = openRequest.result;

返回类型:IDBDatabase

接口名称

类型

说明 

IDBOpenDBRequest.name

属性(只读)

DOMString类型,当前连接数据库名

IDBOpenDBRequest.objectStoreNames 

属性(只读)

DOMStringList类型,当前连接连接数据库中所有的object store 名字列表。 

IDBOpenDBRequest.version 

属性(只读)

64-bit 整型数,当前连接数据库的版本 。当数据第一次被创建时,这个属性是一个空的字符串

IDBOpenDBRequest.onabort

事件

在中断数据库访问时触发

IDBOpenDBRequest.onclose 

事件

在一个单独的线程中关闭数据库连接并立即返回 

IDBOpenDBRequest.onerror 

事件

当访问数据库失败时触发

IDBOpenDBRequest.onversionchange 

事件

当数据库结构发生更改时触发

 

例如:transaction = database.transaction(stores, mode);

返回类型:IDBTransaction

接口/属性

 

说明 

IDBTransaction.db

属性(只读)

当前事务所属的数据库连接

IDBTransaction.error  

属性

 

IDBTransaction.mode 

属性(只读)

使用事务模式,如readonly、readwrite等

IDBTransaction.objectStoreNames 

属性

返回一个DOMStringList类型, IDBObjectStore 

IDBTransaction.onabort

事件 

 

IDBTransaction.oncomplate 

事件 

 

IDBTransaction.onerror 

事件 

 

IDBTransaction.onversionchange 

事件 

 

 

事务种类

IDBTransaction.READ_ONLY       readonly     默认

IDBTransaction.READ_WRITE     readwrite

IDBTransaction.VERSION_CHANGE     版本升级

 

例如:store = transaction.ojbectStore(stores);

返回类型:IDBObjectStore 

接口/属性

类型

说明 

IDBObjectStore.autoIncrement 

 

 

IDBObjectStore.indexNames 

属性

使用事务模式

IDBObjectStore.keyPath 

属性

 

IDBObjectStore.name 

属性

 

IDBObjectStore.transaction 

方法

事件的事件处理器 

IDBObjectStore.autoIncrement 

属性

 true/false

 

例如:request = store.get(id);

返回类型:IDBRequest

接口/属性

类型

说明 

IDBRequest.error 

属性(只读)

当前事务所属的数据库连接

IDBRequest.onerror 

 

 

IDBRequest.onsuccess 

属性(只读)

使用事务模式

IDBRequest.readyState 

 

返回一个DOMStringList类型, IDBObjectStore 

IDBRequest.result 

 

事件 

IDBRequest.source 

 

事件的事件处理器 

IDBRequest.transaction 

 

事件 

 

 

三、CRUD操作

 

指定游标范围
openKeyCursor() 等同于openCursor()
IDBKeyRange.only(value) 只获取指定数据
IDBKeyRange.lowerBound(value, isOpen) 获取最小是value的数据,第二个参数用来指示是否排除value值本身,也就是是否关闭区间
IDBKeyRange.upperBound(value, isOpen) 和上面类似,用于获取最大值是value的数据 如果isOpen为true,即为[value, ~)
IDBKeyRange.bound(value1, value2, isOpen1, isOpen2) 查询[value1,value2) 区间内的数据

//第二个参数为游标的方向:
IDBCursor.NEXT 顺序循环
IDBCursor.NEXT_NO_DUPLICATE 顺序循环不重复
IDBCursor.PREV 倒序循环
IDBCursor.PREV_NO_DUPLICATE 倒序循环不重复

 

 

//查询数据
function getData() {
//事务的创建
var tx = database.transaction(["user"], "readonly"); //readwrite readonly
var store = tx.objectStore("user");
var request = store.get(1001);
request.onsuccess = function() {
var user = request.result;
//var user = event.target.result;
console.log(JSON.stringify(user));
};
}

//游标查询所有
function getAllData() {
//事务的创建
var tx = database.transaction(["user"], "readonly"); //readwrite readonly
var store = tx.objectStore("user");
var openCursor = store.openCursor();
openCursor .onsuccess = function() {
var cursor= request.result;
//var cursor = event.target.result;
if(cursor){
console.log(JSON.stringify(cursor.value));
cursor.continue();
}
};
}

//游标+索引查询
function getDataByIndexAndCursor() {
var tx = database.transaction(["user"], "readonly"); //readwrite readonly
var store = tx.objectStore("user");
var index = store.index("nameIndex");
var request = index.openCursor(IDBKeyRange.lowerBound("123"));
//var request = index.openCursor(IDBKeyRange.bound("a","v", false, true)); //区分大小写
request.onsuccess = function() {
var cursor = request.result;
if (cursor) {
console.log(JSON.stringify(cursor.value));
cursor.continue();
}
}
}
//获取记录数
function count() {
var tx = database.transaction(["user"], "readonly");
var store = tx.objectStore("user");
var request = store.count();
request.onsuccess = function() {
var count = request.result;
console.log(count);
}
}
//按索引查询
var findByIndex = function() {
var mode = IDBTransaction.READ_ONLY;
var tx = database.transaction(["user"], "readonly");
var store = tx.objectStore(["user"]);
var index = store.index("idIndex");
var request = index.get(1001);
console.log(request);
request.onsuccess = function() {
var data = request.result;
console.log(JSON.stringify(data));
}
}
//添加数据
function addData(){
var tx = database.transaction(["user"],"readwrite");
var store = tx.objectStore("user");
var user4 = {id:1004, username: "caoxiaobo", password: "123456", age: 23,other:"test"};
var user5 = {id:1005, username: "adminuser", password: "123456", age: 24};
var user6 = {id:1006, username: "test1user", password: "123456", age: 25};
store.put(user4);
store.put(user5);
store.put(user6);
}

//删除数据
function delData(){
var tx = database.transaction(["user"],"readwrite");
var store = tx.objectStore("user");
store.delete(1004);
store.delete(1005);
store.delete(1006);
}

//清空数据
function clearData(){
var tx = database.transaction(["user"],"readwrite");
var store = tx.objectStore("user");
store.clear( );
}

//修改数据
function updata(){
var tx = database.transaction(["user"],"readwrite");
var store = tx.objectStore("user");
var request = store.get(1008);
request.onsuccess = function(event) {
var user = event.target.result;
user.username = "cxb1008";
user.age = 28;
store.put(user);
}
}

举报

相关推荐

0 条评论