我花了几个小时来搜索这个,只是通过反复试验才能最终找到解决方案。在Stack Overflow中记录此信息,供将来的搜索者使用。
问:
如何在indexeddb中创建复合键?
使用以下命令在对象存储上的indexeddb中创建密钥:
var db;
var openRequest = indexedDB.open('myDB', 1);
openRequest.addEventListener('error', () => {
console.error('Unable to open db');
});
openRequest.addEventListener('upgradeneeded', function(event){
var store = db.createObjectStore('myStore',
{keyPath: /* composite key */ }
);
});
openRequest.addEventListener('success', function(){
db = openRequest.result;
});
我尝试过放置对象,多次定义,如何创建复合键,或者这是API的限制?
注意:如果您正在寻找如何使用范围查询复合键,请查看this帖子
答案 0 :(得分:21)
答强>
事实证明,答案很简单,但在我看过的任何地方都没有记录,乍看之下并不明显。使用字符串数组......
var store = db.createObjectStore('myStore',
{keyPath: ['id1', 'id2']}
);
也可以以相同的方式创建复合索引。
答案 1 :(得分:2)
补充一点,实际使用复合键,也不是很清楚。
添加一个对象还不错:
myStore.add({
id1: 'a', // first part of key
id2: 'b', // second part of key
etc: 'c', // other data to store
});
然而,使用复合键再次获取对象并不是那么明显。您需要传递一个数组作为键,其值的顺序与最初传递给 keyPath
的 createObjectStore()
数组的顺序相同。
myStore.get(['a', 'b']) // look for id1=a + id2=b
此处,数组中的第一个值 (a
) 与 keyPath[0]
匹配,后者在上述答案中设置为 id1
。