Is there a way to get a random string from indexeddb

I want to get a random row from a table of dishes, how to do this?

My code is:

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']; } }; 
+5
source share
2 answers

Instead of moving one line at a time until you hit your random result, how about using the (n) option to jump to a random set? Here is a complete example. It involves two buttons for seeding data and for calling a random selection. I'm going to blog 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); } }; }; }); }; }); 
+5
source

OK, I developed this solution, and it is great for retrieving a random row from a table:

  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 to get a random number between two values:

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

Source: https://habr.com/ru/post/1207656/


All Articles