在 浏览器 IndexedDB 简明教程 ( 十四 ) - 创建索引 章节的范例中,我们为存储对象 city
的键 city_name
创建了一个索引,但我们要怎么知道一个存储对象上有哪些索引呢 ?
答案就是通过 IDBObjectStore
的 indexNames
属性
IDBObjectStore.indexNames 属性
IDBObjectStore
的 indexNames
属性是一个 DOMStringList
类型,它是一个字符串列表,存储了某个存储对象上的所有索引
如果你对 DOMStringList 不熟悉,可以访问 浏览器 IndexedDB 简明教程 ( 八 ) - 判断某个存储对象是否存在 中的相关节
因此,我们可以在 indexNames
属性上调用 contains()
方法可以用来判断某个索引是否存在,参数很简单,就是索引的名称
例如下面的代码,如果存储对象 city
上已经存在了名为 city_name
的索引则不重新创建,创建一个 city_name
的新索引
var db; //先删除 window.indexedDB.deleteDatabase('demo') const req = window.indexedDB.open('demo'); req.onerror = function (event) { console.log('打开数据库失败'); }; req.onsuccess = function (event) { console.log('打开数据库成功'); db = event.target.result; var ts = db.transaction( ['city'] ,'readwrite'); var city_os = ts.objectStore('city'); city_os.add({city_id:100000,'city_name':'北京'}); city_os.add({city_id:300000,'city_name':'天津'}); console.log('往 city 里添加了两条数据'); }; req.onupgradeneeded = function (event) { console.log('升级成功'); db = event.target.result; var city_os = db.createObjectStore('city',{keyPath:'city_id'}); if ( ! city_os.indexNames.contains('city_name')) { // 创建一个新的索引 city_name city_os.createIndex('city_name', 'city_name', { unique: false }); console.log('在存储对象 city 上创建了一个索引 city_name'); } }
输出结果如下
升级成功 在存储对象 city 上创建了一个索引 city_name 打开数据库成功 往 city 里添加了两条数据
目前尚无回复