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 を返し、そうでない場合は数値エラー コードを返します (数値エラーと結果コードを参照してください)。

1 つ以上の SQL ステートメントがクエリである場合、 func で指定されたコールバック関数がクエリ結果の行ごとに 1 回呼び出されます ( func が nil の場合、コールバックは呼び出されません)。コールバックは 4 つの引数を受け取ります: udata (db:exec() 呼び出しの 3 番目のパラメーター)、行の列の数、列の値を持つテーブル、列名を持つ別のテーブルです。コールバック関数は 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 に答える