fc2ブログ
日曜なのに朝から人と会いに出かける。
久しぶりに、初対面でどう対応したいいのかわからない状況になった。
コミュ能力が落ちたか?ww まあ最終的には落ち着いたからいいか。
やはり平時の経験だなあ。もうちょいリハビリしたいぜ。


話は変わって、、、。

アプリを作り中なのに、別のアプリが気になってそっちに手を出すw
まあ、以前作ったものの手直しなんだけどね。

簡単にいえば湯遊ナビの全面刷新をしようかなと。
一緒にやってたデータ担当者が別のことで忙しいので、データ精度は仕方がない。
いずれ彼のがんばりに期待しよう。俺はデータ以外の担当だ。

このアプリは温浴施設をDBに登録して、そこからさまざまな方法で検索させている。
都道府県別に検索したり、緯度経度を元に近くの施設を検索することもできる。
現在のバージョンは、iOSのCoreDataを使っている。
iOSが標準で用意しているDBだからね。このアプリを作った頃は、まず標準を理解するが優先だった。
バージョンアップ時のDBスキーマ変更とか、いろいろやったもんだ。
当時は資料が少なくてなぁ…。あの時の苦労はいろんな場所で役立つことになった。

そして、今回はSQLiteを使うことにする。
O/Rマッパーは優れた技術だと思うが、まだ完全だとは思えない。
今回はSQLで古いなりにやってみよう。
CoreDataが面倒で日和っているわけじゃ、、、、アルようなナイようなwww


じゃあさっそくアプリに組み込み!
というわけにはイカンのだw

SQLiteはデータを一つのファイルとして持っている。
これがなきゃそもそもDBが動かないのぜw

空のDBを作ってもいいが、実際は他のDBから書き出すのが安全だろう。
DBサービスをiOSで提供する場合、SQLiteで0から作るっていうのはまずないだろうし。

今回はWebでサービスを提供しているMySQLからSQLiteに入れてみる。

まずはテーブルかDBインスタンスをmusqldumpで書き出す。

続いて、MySQLでは有効だがSQLiteでは無効な行を潰す。
実際はEngine=MyISM〜〜などのテーブル定義最終行と、/*コメント*/部分になるだろう。

最後にSQLiteのデータファイルに書き込む。
今回はFirefoxにSQLite用のクライアントアドオン「SQLite Maneger」を突っ込んだ。
このアドオンは空のSQLiteファイルを作ることもできるので楽である。

アドオンをインストしたあとに、ツールメニューの SQLite Maneger で起動する。

まずは左上の白紙のボタンを押して新しいDBを作る。保存先はデスクトップなどどこでもOK。
続いてDBに矢印を突っ込んでる「取り込み」ボタンを押して、右のエリアを Import Wizard に切り替える。
あとはさっき修正したmysqldumpのファイル名を指定して、「SQL」を選び、「OK」すればよい。
ダンプ内容にエラーがあれば表示してくれるので、そこを直すこと。

成功すれば左のテーブル一覧「Tables」に、インポートしたテーブルが入っている。
テーブルを選んで「参照と検索」を選べば、テーブルの内容が表示される。

これでSQLiteのファイル作成は完了だ。
このファイルは拡張子に.sqliteとあるが、プロジェクトに組み込む前に.dbに変える。
普通の方法では変わらないことがあるので、Finderの「情報を見る」で確実に拡張子が変わっていることを確認しよう。「情報を見る」の内部でも変更できる。

ちなみに、SQLiteはデータが1ファイルになっているので、
SQLite Maneger で直接中身を見ることもできる。このあたりは実にお手軽だね。
スケールとかいくつかの問題はあるが、適材適所ってことだな。

さてここからはXcodeの作業だ。

iOSにはFMDBというSQLite用のライブラリがある
https://github.com/ccgus/fmdb

ここからzipでダウンロードして解凍すると、中にはいろいろ出てくるが、
メインで使うのはsrc配下のファイルだ。

src配下のfmdb.m以外を全部利用する(fmdb.mはmain.mの入ったサンプルコードの呼び出し元)。
それらを自分のプロジェクトディレクトリにコピーしてAddする。
さらにライブラリとしてlibsqlite3.0.dylibを追加すること。
これは既存のフレームワーク(mapkitとか)と同じ方法で組み込む。

さらに、さっきつくったSQLiteファイルもプロジェクトにコピーして組み込む。拡張子に注意。

あとはDBを使いたいビューなどで下のようにインポート。
#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"

あとは接続してselectなどすればいい。
ここから先はこのページのほうが役立つだろう。
FMDBをつかってiPhoneで簡単にSQLiteを使う

最低限の部分だけコメントを追加して転載


//DBへ接続するメソッド
-(id) dbConnect{
BOOL success;
NSError *error;
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
// ここでSQLiteのファイルを指定する
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"sample.db"];
NSLog(@"%@",writableDBPath);
success = [fm fileExistsAtPath:writableDBPath];
if(!success){
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sample.db"];
success = [fm copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if(!success){
NSLog(@"%@",[error localizedDescription]);
}
}

FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath];
return db;
}

実際に呼び出すのはこんな感じ。

// DBに接続する
FMDatabase* db = [self dbConnect];
if ([db open]) {
[db setShouldCacheStatements:YES];

// SELECTするSQLクエリ
FMResultSet *rs = [db executeQuery:@"SELECT * FROM test2 limit 10"];
// 結果を連続処理する
while ([rs next]) {
// 各カラムの内容へアクセスしてログに出力。カラム名は適宜変更すること
NSLog(@"%d %@", [rs intForColumn:@"test2id"], [rs stringForColumn:@"name"]);
}
[rs close];
[db close];
}else{
NSLog(@"Could not open db.");
}


元ページだとINSERTとかも書いてある。是非一読を。

これで、使い慣れたSQLがiOSで動きそうだ。

まあ実際はCoreDataも、中身はSQLite。O/Rマッパーが完全に包んでいるわけだな。
自分の使いやすい方、状況にあった方を使えばよい。開発における選択肢は重要だ。

リファクタリングは自分を成長させる機会でもある。
前向きに行こう。

2012.11.11 Sun l 未分類 l コメント (1) トラックバック (0) l top

コメント

管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
2013.02.13 Wed l . l 編集

コメントの投稿












トラックバック

トラックバック URL
http://code2wing.blog83.fc2.com/tb.php/74-718319b0
この記事にトラックバックする(FC2ブログユーザー)