如何删除IndexedDB中以指定前缀开头的键范围?
IndexedDB 删除特定前缀键的正确方法
你当前使用IDBKeyRange.lowerBound()的问题在于,它会匹配所有大于等于指定前缀的键,比如如果存在zoo/xxx这类键,也会被误删除(字符串排序中z在t、s之后),无法精准限定前缀范围。
要精准删除以trackList/或songBook/开头的键,需要构造左闭右开的键范围:左边界为前缀本身,右边界设为前缀的"上限阈值"(比如Unicode最大字符\uffff,所有常规字符串都小于它),确保只匹配前缀开头的键。
正确代码示例
// 删除所有以 trackList/ 开头的键 const trackListRange = IDBKeyRange.bound('trackList/', 'trackList/\uffff', false, true); await db.delete('store', trackListRange); // 删除所有以 songBook/ 开头的键 const songBookRange = IDBKeyRange.bound('songBook/', 'songBook/\uffff', false, true); await db.delete('store', songBookRange);
参数说明
IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen)的四个参数:
lower:范围的左边界(这里是前缀字符串)upper:范围的右边界(前缀+\uffff)lowerOpen:设为false,表示包含左边界的键upperOpen:设为true,表示不包含右边界的键,这样就能精准匹配所有以指定前缀开头的键
如果你的业务键可能包含\uffff这类特殊字符,可以换用前缀的"下一个字符"作为上界,比如trackList/的上界用trackList0(/的ASCII码为47,0为48,比/大),但\uffff的方式通用性更强。
内容的提问来源于stack exchange,提问作者Skip
相关产品推荐
相关产品推荐

