2014-11-25 9 views
5

abrufen Ich möchte eine zufällige Zeile aus der Tabelle der Mahlzeiten abrufen, wie ist der Weg, das zu tun?Gibt es eine Möglichkeit, zufällige Zeile von indexeddb

Mein 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']; 
      } 
}; 

Antwort

5

statt zu einem Zeitpunkt eine Zeile voran, bis Sie Ihr zufälliges Ergebnis treffen, Was ist mit der Verwendung von advance (n), um eine zufällige Menge hochzuspringen? Hier ist ein komplettes Beispiel. Es nimmt zwei Knöpfe an, um Daten zu säen und die zufällige Auswahl anzurufen. Ich werde diesen Montag bloggen.

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

       }; 

      }; 

     }); 

    }; 

}); 
+0

Noch weitere Details über cursor.advance? –

+0

Siehe Spezifikation: https://dvcs.w3.org/hg/IndexedDB/raw-file/default/Overview.html#widl-IDBCursor-advance-void-unsigned-long-count –

1

OK, habe ich diese Lösung entwickelt, und es funktioniert einfach perfekt zufällige Zeile aus der Tabelle abzurufen:

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();} 

     } 
     }; 

Funktion der Zufallszahl zwischen zwei Werten zu erhalten:

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