在大多数的turorial中,它展示了如何通过用光标迭代它来从对象存储中检索所有记录。 但是,如何通过键“myKey”从对象库中检索值?
答案 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 );
然后,您可以添加onsuccess
和onerror
回调来解析生成的事件对象,您需要从中提取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,例如Dexie,JsStore,LocalForage和SFDatabase-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"}]