【问题标题】:Deleting all records in indexedDB object store for a specific index value删除 indexedDB 对象存储中特定索引值的所有记录
【发布时间】:2023-04-03 06:40:01
【问题描述】:

对于数组键为[a,b] 的对象存储,其中a 也是索引,有没有比在索引@ 上打开游标更有效的方法来删除a 特定值的所有记录987654324@ 并通过光标逐步删除每条记录?

有没有办法只为索引定义键范围,或者只在a 上定义b 对任何值开放,这样可以删除该键范围的所有记录?

在这种特殊情况下,a 是不包括零的正整数,b 是包括零的正整数。无论b 的值如何,是否可以保证从 [n,0] 到 [n+1,0] 的键范围返回与索引 a=n 等效的所有键?例如,IDBKeyRange.bound( [2,0], [3,0], false, true) 将返回索引 a=2?的所有键?

上面的键范围适用于我的测试用例,但我想知道如果b 不是整数时如何处理这种情况,使其成为一种特殊情况。

以下内容似乎不起作用,因为它只会删除具有key2 的记录。一般情况下有这样的方法吗?

i = transaction.objectStore( name ).index( 'a' );
i.delete( 2 );

谢谢。

当我了解更多并查看下面生成所需结果的代码时,我不再确定它为什么会起作用。键是复合 [ topic, note ]k 仅设置为主题值。所以,n 中的任何键都不应该匹配 k,不是吗?

我不明白为什么n.openCursor( k ) 返回任何要处理的记录,因为没有一个简单的密钥。 k是作为记录的键还是索引值?

T = DB_open.base.transaction( ['notes'], 'readwrite' ),
o = T.objectStore( 'notes' ),
k = IDBKeyRange.only( topic_value );
n = T.objectStore( 'notes' ).index( 'topic' );

n.openCursor( k ).onsuccess = ( e ) =>  { /* stepped through cursor */ };

看来我没有理解的是索引的key参数不是实际记录的键而是索引的键,这里是主题值。对于读取操作和游标,效果很好;但是索引上没有删除方法,例如 deleteAll 等价于 getAll

我想我几个月前在编写游标代码时一定已经理解了这一点,但现在在不打开游标的情况下尝试删除特定索引值的一组记录时让自己感到困惑。

【问题讨论】:

    标签: javascript indexeddb


    【解决方案1】:

    看来我没有理解的是索引的key参数不是实际记录的键而是索引的键,这里是主题值。对于读取操作和游标,效果很好;但索引上没有删除方法,例如 deleteAll 等价于 getAll

    你是对的,key 是索引键。并且没有一个命令可以说“删除与索引中某个键或键范围匹配的每条记录”。 Here is some discussion about this - 我的解释是,没有一个很好的论据来反对该功能的存在,但它是一个非常罕见的用例,它只是作为未实现的功能请求而坐在那里。

    但是,如果主键是复合键并且复合键中的第一个条目是您要过滤的字段,您可以使用 KeyRange 并将其传递给 IDBObjectStore.delete,就像您建议的那样:

    在这种特殊情况下,a 是一个不包括零的正整数,b 是一个包括零的正整数。无论b 的值如何,是否可以保证从 [n,0] 到 [n+1,0] 的键范围返回与索引 a=n 等效的所有键?例如,IDBKeyRange.bound( [2,0], [3,0], false, true) 将返回索引 a=2?的所有键?

    是的,那会起作用。

    您也可以自己动手玩一下:

    var range = IDBKeyRange.bound( [2,0], [3,0], false, true);
    console.log(range.includes([2, -1])); // false
    console.log(range.includes([2, 0])); // true
    console.log(range.includes([2, 100])); // true
    console.log(range.includes([2, Infinity])); // true
    console.log(range.includes([3, 0])); // false
    

    只是为了好玩...你也可以这样定义你的键范围:

    var range = IDBKeyRange.bound( [2,0], [2,""], false, true);
    

    因为数字排在字符串之前。有很多其他方法可以编写相同的内容。这一切都归结为如何在 IndexedDB 规范中进行跨类型比较。一旦有了数组或多种类型,事情就会变得有趣。

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      相关资源
      最近更新 更多