在大多数教程中,展示了如何通过使用游标遍历对象存储来检索所有记录。 但是如何通过对象存储的键“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 );
然后您可以添加一个 onsuccess
和 onerror
回调来解析生成的事件对象,您需要从中提取 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/