window.indexedDB =
window.indexedDB ||
window.webkitIndexedDB ||
window.mozIndexedDB ||
window.msIndexedDB;
window.IDBTransaction =
window.IDBTransaction ||
window.webkitIDBTransaction ||
window.msIDBTransaction;
window.IDBKeyRange =
window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;
window.IDBCursor =
window.IDBCursor || window.webkitIDBCursor || window.msIDBCursor;
function createObjectStore() {
var dbName = 'indexedDBTest'; // 数据库名
var dbVersion = 20220430; // 版本号
var idb;
var dbConnect = indexedDB.open(dbName, dbVersion);
dbConnect.onsuccess = function (e) {
idb = e.target.result;
console.log('数据库连接成功');
};
dbConnect.onerror = function (e) {
console.log('连接 indexedDB 数据库失败');
};
dbConnect.onupgradeneeded = function (e) {
idb = e.target.result;
var t = e.target.transaction;
var n = 'users';
var o = {
keyPath: 'userID',
autoIncrement: false,
};
var store = idb.createObjectStore(n, o);
console.log('数据库创建成功');
};
}
在上面代码中,监听数据库连接的请求对象的 onupgradeneeded 事件,并且指定在该事件触发用数据库对象的 createObjectStore ()方法创建对象仓库。
createObjectStore ()方法包含两个参数∶ 第一个参数值为一个字符串,代表对象仓库名;第二个参数为可选参数 optionalParameters ,参数值为一个 JavaScript 对象,该对象的 keyPath 属性值用于指定对象库中的每一条记录使用哪个属性值来作为该记录的主键值。 一条记录的主键为数据仓库中该记录的唯一标识符,在一个对象仓库中,只能有一个主键,但是键值可以重复,相当于关系型数据库中数据表的 id 字段为数据表的主键,多条记录的 id 字段值可以重除非将主键指定为唯一主键。
在 indexedDB API 中,对象仓库中的每一条记录均为具有一个或多个属性值的一个对象,而 keyP 属性值用于指定每一条记录使用哪个属性值作为该记录的主键值。例如,在这里将数据记录的 userID 届值作为每条记录的主键值,相当于在关系型数据库中将每条记录的 userID 字段值指定为该记录的主键。
在这种情况下,因为主键存在于每条记录内部,所以被称为内联主键,如果在这里不指定 keyP 属性值,或将其指定为 nulI ,每条记录的主键将通过其它的途径被另行指定,这时因为数据记录的主键存在于每条记录之外,所以被称为外部主键。
o 对象的 autoIncrement 属性值为 true ,相当于在关系型数据库中将主键指定为自增主键,如果添加数据记录时不指定主键值,则在数据仓库内部将自动指定该主键值为既存的最大主键值 + 1 。也可以在添加数据记录时显式地指定主键值。如果将 optionalParameters 对象的 autoIncrement 属性值指定为 false ,则必须在添加数据记录时显式地指定主键值。
createObjectStore ()方法返回一个 IDBObjectStore 对象,该对象代表被创建成功的对象仓库。
indexedDB 数据库中的索引类似与关系数据库中的索引,需要在数据记录对象的某个属性值来创建。在 indexedDB 数据库创建索引后,可以提高对数据库中的所有数据记录进行检索时的性能。
在关系型数据中,可以针对非索引字段进行检索,而在 indexedDB 数据库中,只能针对被设为索引的属性值索引。
window.indexedDB =
window.indexedDB ||
window.webkitIndexedDB ||
window.mozIndexedDB ||
window.msIndexedDB;
window.IDBTransaction =
window.IDBTransaction ||
window.webkitIDBTransaction ||
window.msIDBTransaction;
window.IDBKeyRange =
window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;
window.IDBCursor =
window.IDBCursor || window.webkitIDBCursor || window.msIDBCursor;
function createObjectStore() {
var dbName = 'indexedDBTest'; // 数据库名
var dbVersion = 20220430; // 版本号
var idb;
var dbConnect = indexedDB.open(dbName, dbVersion);
dbConnect.onsuccess = function (e) {
idb = e.target.result;
console.log('数据库连接成功');
};
dbConnect.onerror = function (e) {
console.log('连接 indexedDB 数据库失败');
};
dbConnect.onupgradeneeded = function (e) {
idb = e.target.result;
var t = e.target.transaction;
var n = 'users';
var o = {
keyPath: 'userID',
autoIncrement: false,
};
var store = idb.createObjectStore(n, o);
console.log('数据库创建成功');
var a = 'userNameIndex';
var k = 'userName';
var o = { unique: false, multiEntry: false };
var idx = store.createIndex(n, k, o);
console.log('创建索引成功');
};
}
在数据库的版本更新事务中,在对象仓库创建成功后,调用对象仓库的 createIndex (0方法创建该方法包含 3 个参数∶
optionalParameters 对象的 multiEntry 属性值为 true ,代表当数据记录的索引属性值为一个数组时可以将数组中的每一个元素添加在索引中;multiEntry 属性值为 false ,代表只能将该数组整体添加在索引中。 createIndex ()方法返回一个 IDBIndex 对象,代表创建索引成功。