FMDB を RubyMotion から使う

FMDB ではいろいろできるが、とりあえず自分に必要な部分だけメモ。それ以外に必要な方は、Read Me などを参照するか、ググってください。あと、SQLite 自体の使い方は詳しく書かないので、他を当たってください。

まずは、データベースファイルを作って、その中にデータベーステーブルを作る。

まずは、FMDatabase.databaseWithPath(path) で、path を指定して FMDB のオブジェクトを作る。すでにファイルがある場合は、それが開かれ、ない場合は新規に作成される。データベースにアクセスする場合は、その度に、open で開いて close で閉じる。SQL 文は、SELECTexecuteQuery で、それ以外は 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 を使う。