Если вы ищете простое хранилище ключей / значений, вы можете рассмотреть 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
находится в неосновномindex (тот, который вы добавили после создания магазина), вы открываете индекс для своей транзакции и затем открываете курсор на индексе.
var transaction_index = transaction.index( index );
var request = transaction_index.get( key );
Что касается курсоров (которые вы, вероятно, видите обсуждаемыми чаще, потому чтоон вам понадобится всякий раз, когда у вас есть несколько значений, хранящихся под одним и тем же ключом), вы также можете использовать их для получения значений для одного ключа.Говорит спецификация :
Ключевой диапазон может состоять из одного значения.
Вам нужно будет сгенерировать keyRange
, используяIDBKeyRange
объект.Вот вспомогательный метод для этого из MD-лицензированной 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 );