【问题标题】:How to display the highest value from a column in a sqlite database in lua corona如何在lua corona中显示sqlite数据库中列的最大值
【发布时间】:2023-04-02 04:36:01
【问题描述】:

我正在创建一个游戏,完成后将其存储在数据库中(添加它的代码如下)

-- open SQLite database, if it doesn't exist, create database
local path = system.pathForFile("leaderboards.sqlite", system.DocumentsDirectory)
db = sqlite3.open( path ) 
print(path)
-- setup the table if it doesn't exist
local tablesetup = "CREATE TABLE IF NOT EXISTS leaderboards (id INTEGER PRIMARY KEY, score INDEXED);"
db:exec( tablesetup )
print(tablesetup)
-- save student data to database
local tablefill = "INSERT INTO leaderboards VALUES (NULL,'" .. score .. "');"
print(tablefill)
db:exec( tablefill )
--   close database
db:close()
print("db closed")

然后我想在屏幕顶部显示最高分所以这是我的显示功能

local function highScore()
    -- open database    
    local path = system.pathForFile("leaderboards.sqlite", system.DocumentsDirectory)
    db = sqlite3.open( path ) 
    print(path)
    --print all the table contents
    local sql = "SELECT MAX(score) FROM leaderboards"
    local val = db:exec(sql)
    local t = display.newText("Best: "..val, 300, -20, nil, 28)
    print(val)
    t:setTextColor(255,255,255)
    db:close()
end

现在屏幕上只显示 0 而不是高分或任何屏幕。这些值正在数据库中输入,但我的 sql 语句没有显示它。

【问题讨论】:

  • 我的回答有帮助吗?

标签: sqlite lua coronasdk null


【解决方案1】:

最简单的方法是

local val
for x in db:urows "SELECT MAX(score) FROM leaderboards" do val = x end

或者

local sql = "SELECT MAX(score) FROM leaderboards"
for val in db:urows(sql)
  local t = display.newText("Best: "..val, 300, -20, nil, 28)
  print(val)
  t:setTextColor(255,255,255)
end

请参阅urows 文档here

【讨论】:

    【解决方案2】:

    来自the docs

    分贝:执行 db:exec(sql[,func[,udata]]) db:execute(sql[,func[,udata]])

    编译并执行字符串 sql 中给出的 SQL 语句。这 语句只是一个接一个地执行而不存储。这 函数在成功时返回 sqlite3.OK,否则返回数字错误代码 (请参阅数字错误和结果代码)。

    如果一条或多条 SQL 语句是查询,则回调 func 中指定的函数对查询的每一行调用一次 结果(如果 func 为 nil,则不调用回调)。回调接收 四个参数:udata(db:exec() 调用的第三个参数), 行中的列数,包含列值的表和 另一个带有列名的表。回调函数应该 返回 0。如果回调返回非零值,则查询为 中止,所有后续 SQL 语句都被跳过和 db:exec() 返回 sqlite3.ABORT。

    在您的代码中,local val 接收 sqlite3.OK,它可能等于 0。需要提供回调函数来接收行数据,例如

    local function maxscorecb(udata, ncols, colvals, colnames)
      --Assuming that it's always one row and value
      udata[1] = colvals[1]
      return 0
    end
    
    --print all the table contents
    local sql = "SELECT MAX(score) FROM leaderboards"
    local scoretab = {}
    local val = db:exec(sql, maxscorecb, scoretab)
    local t = display.newText("Best: "..scoretab[1], 300, -20, nil, 28)
    print(val)
    t:setTextColor(255,255,255)
    
    db:close()
    

    附:没有测试,只是根据阅读文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2018-04-24
      相关资源
      最近更新 更多