Html5 IndexedDB - получить значение по его ключу - PullRequest
4 голосов
/ 24 ноября 2011

В большинстве турориалов показано, как извлечь все записи из хранилища объектов, перебирая их курсором. Но как вы извлекаете значение из хранилища объектов по его ключу "myKey"?

Ответы [ 2 ]

5 голосов
/ 29 ноября 2011

Если вы ищете простое хранилище ключей / значений, вы можете рассмотреть 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 );
0 голосов
/ 30 июня 2019

Существуют некоторые библиотеки, которые могут помочь вам использовать IndexedDB, например Dexie , JsStore , LocalForage и SFDatabase-js .

Для меня это проще с SFDatabase-js , поскольку использование почти аналогично версии PHP при использовании MySQL / Redis в качестве базы данных. Это также работает для NodeJS. Все, что вам нужно, это определить структуру индексов базы данных и инициализировать базу данных.

var myDB = new SFDatabase('myDB', {
    websql:false,
    idbVersion:1,
    databaseStructure:{
        Users:{
            // rowid -> always unique and incremental
            name:['text', 'unique']
        }
    }
}, function(){
    // database initialized
});

И после этого вы можете хранить практически все в базе данных.

myDB.insert('Users', {name:"Alex", age:17});
myDB.insert('Users', {name:"Ander", age:12});
myDB.insert('Users', {name:"Bell", age:30, admin:true});

Если вы хотите получить однорядные данные, вы можете использовать get.

myDB.get('Users', 'age', {name:"Ander"}, console.log);
//-> 12

myDB.get('Users', ['name', 'age'], {admin:true}, console.log);
//-> {name:"Bell", age:30}

А также получение многострочных данных.

// Age more than 15
myDB.select('Users', ['name'], {'age[>]':15}, console.log);
//-> [{name: "Alex"}, {name: "Bell"}]

// Any name with 'e' and without 'A', and limit to two result
myDB.select('Users', ['name'], {'name[~]':'e', 'name[!~]'=>'A', LIMIT:2}, console.log);
//-> [{name: "Bell"}]
...