【问题标题】:SQLite RANDOM() IssueSQLite RANDOM() 问题
【发布时间】:2023-03-15 06:00:01
【问题描述】:

我有一些 JS 可以创建一个 SQLite 数据库并插入一些数据。

我有一个函数可以查询它,然后将结果信息作为警报吐出。

如果我尝试从数据库中取回一个随机字段,我不会得到任何结果(也没有明显的错误)。


<title>Golf score keeper</title>

<script src="http://www.google.com/jsapi"></script>

<script>
  google.load("jquery", "1.4.1");
</script>

<script>

  $(document).ready(function() {

    var db = window.openDatabase("scores", "", "Previous Scores", 1024*1000);

    db.transaction(function(tx) {
      tx.executeSql('CREATE TABLE IF NOT EXISTS Strokes(id INTEGER PRIMARY KEY, sample TEXT, sample2 TEXT)', []);
    });


    insertScores();
    extractScores()

  });

  function insertScores() {

    var example = "One";
    var example2 = "Two"; 

    db.transaction(function(tx) {
      tx.executeSql('INSERT INTO Strokes (sample, sample2) VALUES (?, ?)', [example, example2]);
    });


    db.transaction(function(tx) {
      tx.executeSql('INSERT INTO Strokes (sample, sample2) VALUES ("example3", "example4")', []);
      tx.executeSql('INSERT INTO Strokes (sample, sample2) VALUES ("example5", "example6")', []);

    });
  }

  function extractScores() {

    db.transaction(function(tx) {

      //THIS ONE FAILS

     // tx.executeSql('SELECT * FROM  Strokes ORDER BY RANDOM() LIMIT 1;', [], displayResults);

      tx.executeSql('SELECT * FROM  Strokes LIMIT 1;', [], displayResults);

    });
  }

  function displayResults(tx, rs){

        var $selectedAnswer = "";
          for (var i=0; i < rs.rows.length; i++) {
                var row = rs.rows.item(i);

            $selectedAnswer =($selectedAnswer + 'sample: ' + row['sample'] + ', sample2: ' + row['sample2']);
        }

        alert($selectedAnswer);
  }

</script>

谁能理解这个?

【问题讨论】:

    标签: javascript jquery sqlite html local-storage


    【解决方案1】:

    我已经用 Chrome 试了一下。 SQL 方言中不支持将 RANDOM() 作为函数。在 Firefox 4 Beta 9 中的结果相同。该查询被视为无效!

    【讨论】:

    • RANDOM() 是 SQLite 的 RAND() 版本。 bernzilla.com/2008/05/13/… 所以除非我使用不正确,否则应该可以工作!
    • 可以,但是chrome/firefox中嵌入的sqlite版本不支持这个功能。尝试用 id 替换 RANDOM() 并且查询有效!
    • 啊,那么获得随机行的最佳方法是什么?进行计数并将其用作最大数字,使用 js 从中生成随机数,并在查询中使用该随机数?
    【解决方案2】:

    我还没有解决这个问题,但我已经创建了一个解决方法。 由于 random 不起作用,并且 select count 不会给我一个数字来玩,这是一个很长的路要走,但它会给我们一个随机数字来查询我们的数据库。

        function finalScores() {
    
            //This gets a the last id in the table "Strokes", we'll use this to generate a random number
            db.transaction(function(tx) {
               tx.executeSql('SELECT id FROM  Strokes ORDER BY id DESC limit 1;', [], lastNumber);
            });
        }
    
    
        function lastNumber(tx, rs){
    
            var $lastNo = "";
    
                //This sets the last id as $lastNo to use later
                for (var i=0; i < rs.rows.length; i++) {
                var row = rs.rows.item(i);
                var $lastNo = row['id'];        
            }
    
        //This should be the last number    
        alert($lastNo);
    
    
        //We use this to avoid getting Zero as an answer
    
        function randomFromTo(from, to){
        return Math.floor(Math.random() * (to - from + 1) + from);
        }
            //This generates a random number between [and including] 1 and your last number
            var $randomNum = randomFromTo(1, $lastNo);
    
        //This is our random number
        alert($randomNum);
    
        }
    

    【讨论】:

      【解决方案3】:

      这根本与 SQLite 无关。 (只是 SQLite 是实现的 SQL 方言)
      我是HTML5 Local Storage

      示例:HTML5 Web Storage / localStorage(点击查看源代码了解更多信息)

      【讨论】:

      • 本地存储是您创建本地值对的时候。当您创建一个开放数据库时,您使用 SQLite - 在 webkit、gecko 等中。(进一步阅读您发送给我的链接!)
      • 这是一个很好的例子,但我想使用 SQLite,而不是 localstorage,它们是两个独立的实体。
      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多