Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any way to retrieve random row from indexeddb

I want to retrieve a random row from the table of meals, how is the way to do that?

My code :

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'];
             }
 };
like image 343
Bashar Abu Shamaa Avatar asked Nov 25 '14 10:11

Bashar Abu Shamaa


Video Answer


1 Answers

Instead of advancing one row at a time until you hit your random result, what about using advance(n) to jump up a random set? Here is a complete example. It assumes two buttons to seed data and to call the random selection. I'm going to be blogging this Monday.

/* 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);
                    }

                };

            };

        });

    };

});
like image 197
Raymond Camden Avatar answered Nov 15 '22 00:11

Raymond Camden