1

これは、stackOverflow に関する私の最初の質問です。私はコロナで作業しており、SQLdb へのアクセスに問題があります (私は少し SQL 初心者です)。

データベースに保存した値にアクセスして返そうとしています。いくつかのコード サンプルを次に示します。

print("---------------- How I Create New Player Save Data")
local entry = [[CREATE TABLE IF NOT EXISTS playerData (key STRING PRIMARY KEY, content INTEGER);]]
db:exec(entry)

entry = [[INSERT INTO playerData VALUES ("LastLoginTime", 0);]]
db:exec( entry )
entry = [[INSERT INTO playerData VALUES ("Credits", 1000);]]
db:exec( entry )
entry = [[INSERT INTO playerData VALUES ("Level", 1);]]
db:exec( entry )

これで、この関数が機能し、データベース内のすべてが出力されます (「dbName」を渡します):

--print all the table contents
for row in db:nrows("SELECT * FROM "..dbName) do
  local text = row.key..":  "..row.content
end

これは機能しません。「0」を返します。

local grabCredits = "SELECT content FROM playerData WHERE key='Credits'"
  local credits = db:exec(grabCredits)
  print("-- value: "..credits)

これも「0」を返します。

local grabCredits = "SELECT key FROM playerData WHERE content>=10"
  local credits = db:exec(grabCredits)
  print("-- value: "..credits)

私が間違っていることを理解していません。たぶん、db で exec() 以外の別の関数呼び出しを使用する必要があります。単一のエントリにアクセスするたびにデータベースを反復処理できることはわかっていますが、それは非効率的です。

どんな助けでも大歓迎です。

4

2 に答える 2

1

結果が必要な場合は、何らかの形式の反復子を使用する必要があります。SQLite は常にクエリ結果の行を返します。

于 2012-07-14T19:50:03.640 に答える
0

これは、データベースから 1 つの結果を取得するために使用しているものと似ており、うまく機能します。

local query = "SELECT content FROM playerData WHERE key = 'Credits' LIMIT 1"

local queryResultTable = {}

local queryFunction = function(userData, numberOfColumns, columnValues, columnTitles)

    for i = 1, numberOfColumns do

        queryResultTable[columnTitles[i]] = columnValues[i]

    end

end

db:exec(query, queryFunction)

for k,v in pairs(queryResultTable) do

    print(k,v)

end
于 2014-11-25T11:46:58.413 に答える