FMDB を RubyMotion から使う
FMDB ではいろいろできるが、とりあえず自分に必要な部分だけメモ。それ以外に必要な方は、Read Me などを参照するか、ググってください。あと、SQLite 自体の使い方は詳しく書かないので、他を当たってください。
まずは、データベースファイルを作って、その中にデータベーステーブルを作る。
まずは、FMDatabase.databaseWithPath(path) で、path を指定して FMDB のオブジェクトを作る。すでにファイルがある場合は、それが開かれ、ない場合は新規に作成される。データベースにアクセスする場合は、その度に、open で開いて close で閉じる。SQL 文は、SELECT は executeQuery で、それ以外は executeUpdate で行う。
db = FMDatabase.databaseWithPath(path)
sql =<<-SQL
CREATE TABLE table_name (
id integer PRIMARY KEY AUTOINCREMENT,
text text,
num numeric
int integer,
decimal real,
data none
);
SQL
db.open
db.executeUpdate(sql)
db.close
SQLite では、指定できる型が 5 つあって、text, numeric, integer, real, none となっている。(none は変換が行われないのでデータの時とかに使える?)
データを入れるには、INSERT を使って次のような感じになる。
db = FMDatabase.databaseWithPath(path)
sql = "INSERT INTO table-name (text) VALUES ('This is a test.')"
db.open
db.executeUpdate(sql)
db.close
これで、テーブルにデータが挿入される。または、Ruby の SQLite3 の様に、次のような ? を使った記述もできるはず。入れる項目が多いときは、ステートメント外に出せるので便利。
db = FMDatabase.databaseWithPath(path)
sql = "INSERT INTO table-name (text) VALUES (?)"
db.open
db.executeUpdate(sql,'This is a test.')
db.close
DELETE なども、同様に行える。
SELECT に関しては、ちょっとめんどくさい。
db = FMDatabase.databaseWithPath(path)
sql = "SELECT * FROM table-name"
db.open
results = db.executeQuery(sql)
while results.next
p results.resultDict
end
db.close
executeQuery で返ってくるオブジェクトは、FMResultSet オブジェクトで、それを while ループで取り出す。
stringForColume(name) などと、型を指定してカラム名で取り出すこともできるが、resultDict にすると、すべてが Hash として返ってくる。ただし、返ってくる Hash は immutable なので、取り出したものに変更を加える場合などは、mutableCopy で、mutable にする必要がある。
上の text だけにひとつ値を入れたものは、次のように返ってきた。
{"id"=>1, "num"=>nil, "data"=>nil, "decimal"=>nil, "text"=>"This is a test."}
これを Array に入れていくか、その都度処理していく。一つ注意する必要がありそうなのが、戻ってきたデータの key がすべて小文字になっていたこと。カラム名に大文字が入っていても、すべて小文字になっていた。カラム名を付けるときは、小文字だけにする必要があるかな。
処理を何度も繰り返したりする場合は、いちいち閉じてしまうと面倒なので、transaction を使う。
db.open
db.beginTransaction
処理
db.commit
db.close
処理のところでエラー処理を入れて、実行前に戻したいときは、commit ではなく rollback を使う。