こんばんは
このところずっとプログラミングにハマってしまいまして、ブログをずいぶんサボっています
何にハマっていたかというと、データベースです
アーチェリーアプリのメインになる画面はできたんですが、そのデータを永続的に保存する方法の目処が立たず色々と研究していました
iOSアプリのデータ保存方法は色々とありますが、UserDefaultとかCoreDataは最初から捨てて、SQLiteを中心としたラッパークラスを検討していました
最初に検討したのはRealmですが、インストールすると途端にxCodeの動きが悪くなるしせっかく買った本もあまり役に立たないし内容的にも3年前の本だったのがよくなかった
本当はRealmがiOSアプリでは主流になってきているみたいなんですが、そこまで高機能は必要としてないのでこれも結局ボツとしました
次に検討したのはSQLiteそのものを使うと言うこと、ハダカのSQLを直接使う事ができるので僕はその方がいいのですが、SQLiteをそのまま使うのがとても難しくこれもボツとしました
次に検討したのはGRDB.swiftと言うSQLiteのラッパーです
ラッパーというのはSQLiteを使いやすくした関数群とでも言うんでしょうか、ネット上の評価もまずまずです
インストール方法が色々とあるんですが、優しそうなのでcocoapodを使ってみました
一発インストールしたら後はいつでもどのプロジェクトでも使えるということにはなりませんが、まあまあ少しの手順でインストールはできます
使い方的にはネットでもいろいろな情報があり、すぐにできるようになるかと思ったんですが、これがとんでも無く時間がかかりました
いくら時間がかかってもしつこく食い下がられたのは、なんとなく「これ良さそう」と言うカンのようなものがありました
ネット上のサンプルを色々と組み合わせてやってみましたが、最初はニッチもサッチもでSQL文を受け付けてくれなくて困りましたが、ちょっとしたことで少しずつ動きができてきました
今日の時点で、データベースを作成しいろいろなSQL文を実行する事ができるようになりました
SQL文はInsert,update,delete,dropなどは戻りがないので単にexecuteするだけ、selectは戻りを配列で受けます
結局、戻りの有無で2種類の基本関数を作っておけば後はそれに与えるSQL文の違いだけになります
ただ一つだけどうしても解決しないドツボに、今日までハマっていました
それはせっかくデータベースにデータを登録してもアプリが動いている時だけでアプリが終わると消えてしまう事です
データベースはデータの更新は一時的でCOMMITをしないと元に戻ってしまうことはわかっていました
結果をコミットという事なんですが、そのCOMMITの仕方が分からなくてずいぶん悩みました
今日最終的に解決したのは結局COMMITしなくてもいいという事です
では消えていたのはどういう事なんでしょうか
実は何回もやっていると不思議なことに以前登録したデータがヒョイと現れることに気が付いたのです
よくよく考えてみて気が付いたのはデータベースファイルの保存場所です
早速調べてみると毎回起動のたびに違うフォルダーにできています
URLを調べるとシミュレーターの動きがらみで毎回乱数のような長い名前のフォルダーにできています
たまたま同じフォルダーになるとひょっこりと前のデータが出てきたということです
そこでファイルのできる場所を直接指定してやってみたらうまく行きました
訳もわからずにNSHomeDirectory()みたいな関数を使っていたのでおかしかったようです
最終的なアプリをiPhone上で動かすときにどこを指定するかはまた調べないといけないのですが、とりあえず開発中はこれでよしということになりました
もう何週間も時間を費やしてしまいましたが、この間の唸るようなしつこい作業も最終的には達成感に変わりました
まだまだ先は長いしこれからもドツボにハマる事があるかもしれませんが、持ち前のしつこさでなんとか切り抜けようと決意を新たにしました(ちょっと大袈裟)
※コメント投稿者のブログIDはブログ作成者のみに通知されます