如何在Lua Corona中从SQLite数据库中显示一列中的最高值

我正在创建一个游戏,当游戏结束时,它会将得分存储在数据库中(以下是添加它的代码)

-- 打开 SQLite 数据库,如果不存在,则创建数据库
local path = system.pathForFile("leaderboards.sqlite", system.DocumentsDirectory)
db = sqlite3.open( path )
print(path)
-- 如果表不存在,则设置表
local tablesetup = "CREATE TABLE IF NOT EXISTS leaderboards (id INTEGER PRIMARY KEY, score INDEXED);"
db:exec( tablesetup )
print(tablesetup)
-- 将得分数据保存到数据库中
local tablefill = "INSERT INTO leaderboards VALUES (NULL,'" .. score .. "');"
print(tablefill)
db:exec( tablefill )
-- 关闭数据库
db:close()
print("db closed")

然后,我想在屏幕顶部显示最高分数,这是我的显示函数:

local function highScore()
    -- 打开数据库
    local path = system.pathForFile("leaderboards.sqlite", system.DocumentsDirectory)
    db = sqlite3.open( path )
    print(path)
    -- 显示所有表内容
    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 语句没有显示它。

点赞
用户2198692
用户2198692

文档 中:

db:exec 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)
  --假定它总是一个行和一个值
  udata[1] = colvals[1]
  return 0
end

--打印所有表内容
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. 尚未进行测试,仅基于读取文档。

2013-04-26 19:02:36
用户33252
用户33252

最简单的方法是

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 文档链接

2013-04-27 16:10:31