有没有办法从indexeddb中检索随机行

时间:2014-11-25 10:20:41

标签: javascript jquery html5 indexeddb

我想从餐桌上检索一个随机行,怎么做?

我的代码:

var transaction = db.transaction(["meals"], "readonly");
var store = transaction.objectStore("meals");
var index = store.index("time");  // to search in the field time type
range = IDBKeyRange.only(3);      // 3 means it is a lunch 

index.openCursor(range).onsuccess = function (e) {
var dt = event.target.result;
    if (dt) {
         var s = dt.value['fno1'];
             }
 };

2 个答案:

答案 0 :(得分:5)

使用advance(n)跳过随机集,而不是一次推进一行直到你的随机结果为止?这是一个完整的例子。它假设有两个按钮来播种数据并调用随机选择。我本周一要写博客。

/* global $,document,indexedDB,console */

/**
 * Returns a random integer between min and max
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt (min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

$(document).ready(function() {
    var db;

    var openRequest = indexedDB.open("randomidb",1);

    openRequest.onupgradeneeded = function(e) {
        var thisDB = e.target.result;

        console.log("running onupgradeneeded");

        if(!thisDB.objectStoreNames.contains("notes")) {
            thisDB.createObjectStore("notes", {autoIncrement:true});
        }
    };


    openRequest.onsuccess = function(e) {
        console.log("running onsuccess");

        db = e.target.result;

        $("#seedButton").on("click", function() {

            var store = db.transaction(["notes"],"readwrite").objectStore("notes");

            for(var i=0; i<10; i++) {
                var note = {
                    title:"Just a random note: "+getRandomInt(1,99999),
                    created:new Date()
                };

                var request = store.add(note);

                request.onerror = function(e) {
                    console.log("Error",e.target.error.name);
                    //some type of error handler
                };

                request.onsuccess = function(e) {
                    console.log("Woot! Did it");
                };
            }

        });

        $("#randomButton").on("click", function() {

            //success handler, could be passed in
            var done = function(ob) {
                console.log("Random result",ob);    
            };

            //ok, first get the count
            var store = db.transaction(["notes"],"readonly").objectStore("notes");

            store.count().onsuccess = function(event) {
                var total = event.target.result;
                var needRandom = true;
                console.log("ok, total is "+total);
                store.openCursor().onsuccess = function(e) {
                    var cursor = e.target.result;
                    if(needRandom) {
                        var advance = getRandomInt(0, total-1);
                        console.log("going up "+advance);
                        if(advance > 0) {
                            needRandom = false;
                            cursor.advance(advance);    
                        } else {
                            done(cursor);
                        }
                    } else {
                        done(cursor);
                    }

                };

            };

        });

    };

});

答案 1 :(得分:1)

好的,我已经开发了这个解决方案,它非常适合从表中检索随机行:

   var transaction = db.transaction(["meals"], "readonly");
    var store = transaction.objectStore("meals"); // name of table
    var index = store.index("time");              // time is name of field and it is a number
    range = IDBKeyRange.only(2);                  // query when time = 2   
    var y = 1; 
    var z = true;
    var x = 0;    // it will equal the random number

    index.openCursor(range).onsuccess = function (e) {
        var dt = event.target.result;
        if (z) {
            x = RandInt(1, dt.key);  // get random number between 1 and count of rows
            z = false;               // to only make the above line one time only
        }
        if (dt) {
            if (x == y) {
                    var s = dt.value['fno1'];
                         }
            else
            { y += 1; dt.continue();}

        }
      };

获取两个值之间的随机数的函数:

 function RandInt(min, max) {
        return Math.floor(Math.random() * (max - min + 1) + min);
    }