如何创建 indexeddb 复合键

How to create an indexeddb composite 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 post

A:

事实证明,答案很简单,但在我看过的任何地方都没有很好的记录,乍一看并不明显。使用字符串数组...

var store = db.createObjectStore('myStore', 
    {keyPath: ['id1', 'id2']}
);

也可以用同样的方式创建复合索引。

对于复合键数据,

补充一点,实际使用复合键,也不是很清楚。

添加对象还不错:

myStore.add({
    id1: 'a',  // first part of key
    id2: 'b',  // second part of key
    etc: 'c',  // other data to store
});

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

keyPath 数组的顺序相同
myStore.get(['a', 'b'])   // look for id1=a + id2=b

在这里,数组中的第一个值 (a) 与 keyPath[0] 匹配,在上面的答案中设置为 id1.