如何在lua corona中显示sqlite数据库中列的最高值

时间:2013-04-26 17:51:55

标签: sqlite lua corona null

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

-- 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语句没有显示它。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

来自the docs

  

分贝:EXEC           分贝:EXEC(SQL [,FUNC [,UDATA]])           分贝:执行(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()

P.S。没有测试过,只是基于阅读文档。