openRequest.onerror = function(e) {
console.log("Database error: " + e.target.errorCode);
};
openRequest.onsuccess = function(event) {
console.log("Database created");
localDatabase.db = openRequest.result;
};
openRequest.onupgradeneeded = function (evt) {
...
};
}
要删除现有数据库,可以调用 deleteDatabase 方法,并传递要删除的数据库名称,如 清单 3 中所示。
清单 3. 删除现有数据库
function deleteDatabase() {
var deleteDbRequest = localDatabase.indexedDB.deleteDatabase(dbName);
deleteDbRequest.onsuccess = function (event) {
// database deleted successfully
};
deleteDbRequest.onerror = function (e) {
console.log("Database error: " + e.target.errorCode);
};
}
清单 4 中的代码段展示了如何打开与现有数据库的连接。
清单 4. 打开数据库的最新版本
function openDatabase() {
var openRequest = localDatabase.indexedDB.open("dbName");
openRequest.onerror = function(e) {
console.log("Database error: " + e.target.errorCode);
};
openRequest.onsuccess = function(event) {
localDatabase.db = openRequest.result; if (localDatabase != null && localDatabase.db != null) { var store = localDatabase.db.transaction("employees") var index = store.index("emailIndex"); index.get(range).onsuccess = function(evt) {
};
}
创建、删除和打开数据库就是这么简单。现在是时候使用对象存储了。
使用对象存储
对象存储是一个数据记录集合。要在现有数据库中创建一个新对象存储,则需要对现有数据库进行版本控制。为此,请打开要进行版本控制的数据库。除了数据库名称之外,open 方法还接受版本号作为第二个参数。如果希望创建数据库的一个新版本(也就是说,要创建或修改一个对象存储),只需打开具有现有数据库版本更高的数据库。这会调用 onupgradeneeded 事件处理函数。
要创建一个对象存储,可以在数据库对象上调用 createObjectStore 方法,如 清单 5 中所示。
清单 5. 创建对象存储
function createObjectStore() {
var openRequest = localDatabase.indexedDB.open(dbName, 2);
openRequest.onerror = function(e) {
console.log("Database error: " + e.target.errorCode);
};
openRequest.onsuccess = function(event) {
localDatabase.db = openRequest.result;
};
openRequest.onupgradeneeded = function (evt) {
var employeeStore = evt.currentTarget.result.createObjectStore
("employees", {keyPath: "id"});
};
}
我们已经了解了对象存储的工作原理。接下来,让我们看看索引 如何引用包含数据的对象存储。
使用索引
除了使用键来检索对象存储中的记录,还可使用代索引的字段来检索记录。对象存储可具有一个或多个索引。索引是一种特殊的对象存储,它引用包含数据的对象存储,在更改所引用的对象存储时(也就是添加、修改或删除记录时)自动更新。
要创建一个索引,必须使用 清单 5 中所示的方法对数据库进行版本控制。索引可以是惟一的,也可以是不惟一的。惟一索引要求索引中的所有值都是惟一的,比如使用一个电子邮件地址字段。当某个值可以重复出现时,需要使用非惟一索引,比如城市、州或国家。清单 6 中的代码段展示了如何在 employee 对象的 state 字段上创建一个非惟一索引,在 ZIP code 字段上创建一个非惟一索引,并在 email address 字段上创建一个惟一索引:
清单 6. 创建索引
function createIndex() {
var openRequest = localDatabase.indexedDB.open(dbName, 2);
openRequest.onerror = function(e) {
console.log("Database error: " + e.target.errorCode);
};
openRequest.onsuccess = function(event) {
db = openRequest.result;
};
openRequest.onupgradeneeded = function (evt) {
var employeeStore = evt.currentTarget.result.objectStore("employees");
employeeStore.createIndex("stateIndex", "state", { unique: false });
employeeStore.createIndex("emailIndex", "email", { unique: true });
employeeStore.createIndex("zipCodeIndex", "zip_code", { unique: false })
};
}
接下来,您将使用事务对对象存储执行一些操作。
使用事务
您需要使用事务在对象存储上执行所有读取和写入操作。类似于关系数据库中的事务的工作原理,IndexedDB 事务提供了数据库写入操作的一个原子集合,这个集合要么完全提交,要么完全不提交。IndexedDB 事务还拥有数据库操作的一个中止和提交工具。
表 1 列出并描述了 IndexedDB 提供的事务模式。
表 1. IndexedDB 事务模式
默认的事务模式为 readonly。您可在任何给定时刻打开多个并发的 readonly 事务,但只能打开一个 readwrite 事务。出于此原因,只有在数据更新时才考虑使用 readwrite 事务。单独的(表示不能打开任何其他并发事务)versionchange 事务操作一个数据库或对象存储。可以在 onupgradeneeded 事件处理函数中使用 versionchange 事务创建、修改或删除一个对象存储,或者将一个索引添加到对象存储。
要在 readwrite 模式下为 employees 对象存储创建一个事务,可以使用语句:var transaction = db.transaction("employees", "readwrite");。
清单 7 中的 JavaScript 函数展示了如何使用一个事务,使用键来检索 employees 对象存储中的一条特定的员工记录。
清单 7. 使用键获取一个特定的记录
function fetchEmployee() {
try {
var result = document.getElementById("result");
result.innerHTML = "";
if (localDatabase != null && localDatabase.db != null) {
var store = localDatabase.db.transaction("employees").objectStore("employees");
store.get("E3").onsuccess = function(event) {
var employee = event.target.result;
if (employee == null) {
result.value = "employee not found";
}
else {
var jsonStr = JSON.stringify(employee);
result.innerHTML = jsonStr;
}
};
}
}
catch(e){
console.log(e);
}
}
清单 8 中的 JavaScript 函数展示了如何使用一个事务,以使用 emailIndex 索引而不是对象存储键来检索 employees 对象存储中的特定员工记录。
清单 8. 使用索引获取特定的记录
function fetchEmployeeByEmail() {
try {
var result = document.getElementById("result");
result.innerHTML = "";
var range = IDBKeyRange.only("john.adams@somedomain.com");
.objectStore("employees");
var employee = evt.target.result;
var jsonStr = JSON.stringify(employee);
result.innerHTML = jsonStr;
};
}
}
catch(e)
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com