2011/08/26

Corona SDKでSqlite3を使う時の簡単なまとめ

Corona SDKでSqlite3を使ったアプリ開発をした際に躓いたりしたので、簡単にまとめておこうと思います。

アプリ内ですからそんなに複雑なSQL文はありません。しかし、SQLの種類によって関数の使い分けが必要でした。最初そこが分からずに意図した値が返ってこないことに悩みました。
そう、値が返ってくるかどうかが、ポイントだったのです。

下記のサンプルコードを見ていただくと分かるのですが、簡単にいうと、SELECT文の時は db:row() や db:nrows() を使い、CREATE文やINSERT文の時は db:exec() を使います。
※くわしくはこちら

ドキュメントの読解力が足りず、COUNT関数の実行に db:exec() を使い、ずっと0しか返って来ない… ってことを延々やっていたわけです(^_^;)
お恥ずかしい
-- Include
require("sqlite3")

-- DB SETUP
local path = system.pathForFile("test.db", system.DocumentsDirectory)
db = sqlite3.open(path)
print("DB PATH: "..path)

local tableName = "User"
print("TABLE NAME: "..tableName)

-- Create Table
db:exec([[CREATE TABLE IF NOT EXISTS ]]..tableName..[[ (id INTEGER PRIMARY KEY, name, age); ]])

-- Insert Data
local name = "hoge" 
local age = 20
db:exec([[INSERT INTO ]]..tableName..[[ VALUES (NULL, ']]..name..[[',']]..age..[['); ]])

-- Count
for row in db:rows([[SELECT COUNT(*) FROM ]]..tableName..[[; ]]) do
  print("ROWS: "..row[1])
end

-- Select Data
for row in db:nrows("SELECT * FROM "..tableName) do
  print("NAME: "..row.name)
  print("AGE: "..row.age)
end

-- Update
age = 30
db:exec([[UPDATE ]]..tableName..[[ SET age=]]..age)
for row in db:nrows("SELECT * FROM "..tableName) do
  print("NAME: "..row.name)
  print("AGE: "..row.age)
end

-- Delete
age = 40
db:exec([[DELETE FROM ]]..tableName..[[ WHERE age < ']]..age..[['; ]])
for row in db:rows([[SELECT COUNT(*) FROM ]]..tableName..[[; ]]) do
  print("ROWS: "..row[1])
end

--
実行結果はこうなります。
※まるごとmain.luaとしてコピペで実行できるように書きました。途中ageの代入式が度々出てくるのはその為です
※上記コードには記述していませんが、適切にDBのCLOSE処理が必要です
Corona SDK≫Docs≫Data and Files≫Database (SQLite)
 
最後にTipsとして、Corona SimulatorのFile > Show Project Sandbox というメニューを選択すると、ローカルに保存されている.dbファイルの場所を開いてくれます。 この.dbファイルをLita等のGUIツールで開けば、データをGUIで確認したり、SQL文のテスト等に使えて大変便利でした。

0 件のコメント: