0

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

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

4

2 回答 2

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的文档。

于 2013-04-27T16:10:31.327 回答
0

文档

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

PS没有测试它,只是基于阅读文档。

于 2013-04-26T19:02:36.453 回答