如何创建indexeddb组合键

时间:2015-11-22 07:10:57

标签: indexeddb composite-primary-key

我花了几个小时来搜索这个,只是通过反复试验才能最终找到解决方案。在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帖子

2 个答案:

答案 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
});

然而,使用复合键再次获取对象并不是那么明显。您需要传递一个数组作为键,其值的顺序与最初传递给 keyPathcreateObjectStore() 数组的顺序相同。

myStore.get(['a', 'b'])   // look for id1=a + id2=b

此处,数组中的第一个值 (a) 与 keyPath[0] 匹配,后者在上述答案中设置为 id1