Html5 IndexedDB - 通过其键检索值

标签 html indexeddb

在大多数教程中,展示了如何通过使用游标遍历对象存储来检索所有记录。 但是如何通过对象存储的键“myKey”从对象存储中检索值?

最佳答案

如果您正在寻找简单的键/值存储,那么您可能需要考虑 localStorage .它比使用 IndexedDB 简单得多。它仅适用于字符串(到目前为止),但对象很容易通过 JSON 对象进行字符串化。

console.log( 'BEFORE', localStorage.getItem( 'test-key' ) );
localStorage.setItem( 'test-key', JSON.stringify( { 'foo': Math.round( Math.random() * 1000 ) } ) );
console.log( 'AFTER', JSON.parse( localStorage.getItem( 'test-key' ) ) );

也就是说,您不需要游标来从 IndexedDB 中的键获取单个值,仅当您需要为一个键或键范围获取多个值时。要从键中获取值,您可以执行以下两项操作之一:

1) 如果 myKey 是您的主键(在创建商店时添加):

var request = transaction.get( key );

然后您可以添加一个 onsuccessonerror 回调来解析生成的事件对象,您需要从中提取 event.target.result 值。

2) 如果 myKey 位于非主索引中(您在创建商店后添加的索引),您在事务中打开索引,然后在索引上打开游标。

var transaction_index = transaction.index( index );
var request = transaction_index.get( key );

至于游标(您可能会更频繁地看到游标,因为当您在同一个键下存储多个值时就需要一个游标),您也可以使用它们来检索单个键的值。说the spec :

A key range may consist of a single value.

您需要使用 IDBKeyRange 对象生成一个 keyRange。这是来自 MIT-licensed InDB 的辅助方法(我正在进行的 IndexedDB 包装器),它处理在单个值(例如 InDB.range.get(value))或键范围上打开游标。

InDB.range.get = function ( value, left_bound, right_bound, includes_left_bound, includes_right_bound ) {
        if ( InDB.exists( left_bound ) && InDB.exists( right_bound ) && InDB.exists( includes_left_bound ) && InDB.exists( includes_right_bound ) ) {   
            return IDBKeyRange.bound( left_bound, right_bound, includes_left_bound, includes_right_bound ); 
        } else if ( InDB.exists( left_bound ) && InDB.exists( includes_left_bound ) ) {
            return IDBKeyRange.lowerBound( left_bound, includes_left_bound );
        } else if ( InDB.exists( right_bound ) && InDB.exists( includes_right_bound ) ) {
            return IDBKeyRange.upperBound( right_bound, includes_right_bound );
        } else if ( InDB.exists( value ) ) {
            return IDBKeyRange.only( value );
        }  else {
            return false;
        }
    }

获得 keyRange 后,您可以执行以下两项操作之一:

1) 如果 myKey 是您的主键(在创建商店时添加),您将在交易中打开一个常规游标(带有可选方向)。

var request = transaction.openCursor( keyRange, direction );

2) 如果 myKey 位于非主索引中(您在创建商店后添加的索引),您在事务中打开索引,然后在索引上打开游标。

var transaction_index = transaction.index( index );
var request = transaction_index.openCursor( keyRange, direction );

关于Html5 IndexedDB - 通过其键检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8256121/

相关文章:

javascript - 索引数据库。如何在光标移动时更新记录

javascript - 如何从 indexeddb 中获取所有值

html - 查看帖子是否在 tumblr 上是私有(private)的?

php - 从表中提取值

javascript - 在窗口调整大小之前,ChartJS 不会在 Bootstrap 选项卡内绘制图形

google-chrome - 超出最大 IPC 消息大小

javascript - 我可以在开发 firefox Os 应用程序时使用 indexedDB 吗

javascript - 将 jquery 控件转换为 javascript

javascript - 如何禁用重复图像的显示?

google-chrome - 检查 IndexedDB objectStore 是否已经包含键