【问题标题】:How to get the next element after keypath using YDN-DB如何使用 YDN-DB 在 keypath 之后获取下一个元素
【发布时间】:2014-10-22 10:10:51
【问题描述】:

我正在尝试构建一个函数,该函数在传递的 keypath 之后检索存储中的下一个元素。我的 getItem 看起来像这样。

req = smartpigsdb.get(store, keypath);
req.done(function(record) { 
    if(record!==undefined || typeof record=='object'){
    // do something with the record
}
else console.log('error getItem: ' + e);
});
req.fail(function(e) {
    console.log(e);
});

如何使用 YDN-DB 实现这一目标?

【问题讨论】:

    标签: javascript indexeddb ydn-db


    【解决方案1】:

    如果您不知道密钥,则不能使用get。您必须使用values 来进行迭代记录。限制为 1,这样您就只能得到一个结果。你可以使用你的know key的lowerBound keyRange,这样你就会得到key之后的下一个对象。

    【讨论】:

    • 我快到了。我创建了一个 ValueIterator: var iter = new ydn.db.ValueIterator(store, '>', idx);要获得数据库中的下一项,我会这样做: db.values(iter, 1).done(function(item) { console.log('JSON.stringify(item));});但我的密钥路径可能像“1”、“3”、“3a”、“3b”、...、“10”、“11”、“11a”...等等。我想在“ 1" 这是项目 keypath = "2" 但我得到的是 keypath = "10" 的项目。如何检索所需的项目?在我的情况下“2”感谢您的帮助。弗罗林
    • Indexeddb 排序键根据 ICU 排序,所以“10”在“2”之前。您可能想改用数字类型键。
    • 顺便说一句,你的意思是key,而不是keyPath。这两个是不同的。
    【解决方案2】:

    最后我做了这样的事情,它有效,但我不确定是不是最好的方法。 'idx' 是存储对象存储的索引。

    var range = new ydn.db.KeyRange.lowerBound(index+1);
    var iter = new ydn.db.Iterator(store, 'idx', range); // 'idx' is an index for store object store
    db.values(iter, 1).done(function(item) {
        if(item.length > 0){
            var req = db.get(store, item[0]);
            req.done(function(record) {
                if(record!==undefined || typeof record=='object'){
                    // do soemthing with the record 
                }
                else {
                    console.log('record could not be found');
                }
            });
            req.fail(function(e) {
                console.log(e);
            });
        }
    });
    

    如果我想检索以前的记录,我用range = new ydn.db.KeyRange.upperBound(index); 尝试了同样的事情,但我总是从商店获得第一条记录,所以我改用range = new ydn.db.KeyRange.lowerBound(index-1);

    请给我一些反馈。再次感谢图书馆。 问候,弗洛林。

    【讨论】:

    • 试试db.from('store').where('idx', '>', index).get().done(... ?
    • 是的,我刚试过。但不是 .get() 从上面我使用 list(1) 像这样: smartpigsdb.from(store).where('idx', '>', index).list(1).done(function(item){ if(item!==null || item!==undefined) doSomething(item[0]); else console.log('no item found'); });当我尝试使用相同的语法来获取上一项时,它会直接跳转到数据库中的第一项。我不知道为什么。
    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2013-07-22
    • 2014-10-07
    • 1970-01-01
    • 2019-05-11
    • 2023-03-13
    相关资源
    最近更新 更多