Html5 IndexedDB - 通过其密钥检索值

时间:2011-11-24 11:12:04

标签: html5 indexeddb

在大多数的turorial中,它展示了如何通过用光标迭代它来从对象存储中检索所有记录。 但是,如何通过键“myKey”从对象库中检索值?

2 个答案:

答案 0 :(得分:5)

如果您正在寻找简单的键/值存储,那么您可能需要考虑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

  

键范围可能包含单个值。

您需要使用keyRange对象生成IDBKeyRange。这是来自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 );

答案 1 :(得分:0)

有一些库可以帮助您使用IndexedDB,例如DexieJsStoreLocalForageSFDatabase-js

对我来说,使用SFDatabase-js更容易,因为使用MySQL / Redis作为数据库时,其用法与PHP version几乎相似。它也适用于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"}]