如何创建 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])
其中var1
和var2
是数值。我的要点仍然是,虽然复合键本身可以是一个数组,但它不必是 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
) 与上述答案中设置为 id1
的 keyPath[0]
匹配。
【讨论】:
以上是关于如何创建 indexeddb 组合键的主要内容,如果未能解决你的问题,请参考以下文章
IndexedDB浏览器本地存储缓存数据库CookieLocal StorageSession StorageWeb SQL