如何创建 indexeddb 组合键

Posted

技术标签:

【中文标题】如何创建 indexeddb 组合键【英文标题】:How to create an indexeddb composite key 【发布时间】:2016-02-24 11:09:59 【问题描述】:

我花了好几个小时寻找这个,只是通过反复试验,我终于找到了解决方案。将其记录在 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 帖子

【问题讨论】:

In IndexedDB, is there a way to make a sorted compound query?的可能重复 @Josh 虽然引用的帖子确实谈到了复合索引,但它主要关注 IDBKeyRange 在选择一系列元素时。这篇文章也没有解释如何为 Indexeddb 对象存储创建复合主键,因此我相信这篇文章不是重复的。 是的,绝对不是重复的。这是关于使用复合keyPath创建(和填充)对象存储;引用的主题是关于从此类商店中提取 项。两者相得益彰,非常有效。他们在一起非常有帮助;正如 SnareChops 所说,这没有很好的记录(即使是四年后!)。 【参考方案1】:

答:

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

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

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

对于复合键数据,see the answer below by Malvineous

【讨论】:

数组元素不必是字符串;数值也可以。 @Velojet 这些字符串是属性名称,而不是键的值。但是,如果您将这样的数组传递给put,那么它就是键的值。 感谢@rudolfbyker 的澄清。我应该明确指出,我指的是put 操作上下文中的复合键数组:db.put(storename, item, [var1, var2]) 其中var1var2 是数值。我的要点仍然是,虽然复合键本身可以是一个数组,但它不必是 strings 的数组。 @snareChops 感谢您的问答,我找不到任何关于如何基于此复合键检索数据的示例或文档。就像我想找到所有具有 id1 的记录并从集合中提取最后一条记录。你能帮忙吗?我添加喜欢 row1 => [id1 = abc & id2 = 1], row2 => [id1 = abc & id2 = 2] @Bsienn 查看下面 Malvineous 刚刚发布的答案【参考方案2】:

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

添加对象还不错:

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) 与上述答案中设置为 id1keyPath[0] 匹配。

【讨论】:

以上是关于如何创建 indexeddb 组合键的主要内容,如果未能解决你的问题,请参考以下文章

indexed database IndexedDB

使用indexedDB(翻译)

IndexedDB浏览器本地存储缓存数据库CookieLocal StorageSession StorageWeb SQL

如何在线性时间内根据键重新组合列表列表?

indexedDB删除有影响吗

如何映射组合键