2012-07-14 93 views
1

這是我在stackoverflow的第一個問題。 我正在與科羅娜和我遇到一個問題訪問SQLdb(我是一個SQL菜鳥)Corona Lua SQLite

我試圖訪問並返回我已經存儲在數據庫中的值。 下面是一些代碼示例:

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) 

我不明白我在做什麼錯。也許我需要使用除exec()以外的其他db函數調用。我意識到每次我想訪問單個條目時都可以遍歷數據庫,但這看起來效率不高。

任何幫助,非常感謝。

回答

1

如果你想要結果,你必須使用某種形式的迭代器。對於查詢結果,SQLite總是返回

+0

所以,只是要清楚。當我想要訪問表中的條目時,我必須總是遍歷整個數據庫?沒有其他方法來獲取條目? – zecmo 2012-07-14 19:55:42

+0

是的,有點兒。你可以做單獨的準備步驟,並在語句中完成/重置調用,但是循環並沒有太多開銷,因爲如果只有一個結果,它將只運行一次迭代。另外,如果你只有一個結果,當有很多時,你可以從循環中斷開。 – 2012-07-14 19:59:17

+0

很酷。我不太瞭解SQL來「分離(和)準備步驟並最終確定/重置語句中的調用。」但其他一切都有道理。非常感謝您的信息! – zecmo 2012-07-14 20:00:20

0

這與我用來從我的數據庫中檢索一個結果類似,並且適用於我。

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