iPhoneデータベース入門(SQLite)Part.3 「検索日記」を実装するにあたっての考え方

前回:iPhoneデータベース入門(SQLite)Part.2 Xcode4.3.2でFMDBを使ったアプリをつくる


(2012/05/19追記)ソースコードGitHubからどうぞ。
https://github.com/ics-hiro/Kensaku_Nikki_ARC
GitHub始めました。まだよくわからないので、詳しい方教えてください!)


検索日記」では、テキストフィールドに文字列をいれると、グーグル検索をおこなうことができ、その結果が日別に保存されます。

教材ダウンロードー>http://itunes.apple.com/jp/app/jian-suo-ri-ji/id517392095?mt=8

大まかな実装を言うと、

  • 検索窓となるテキストフィールド(これはウェブビューで入力するグーグル検索窓ではなく、独自の実装)
  • 検索結果が出ているウェブビュー
  • 検索ワードが保存されているテーブルビュー

ということになりますが、実はいろんな要素をクリアできないと、このアプリをつくることはできません。

こういう時にはこういう考え方をするという、実装に対するぼくの考えの軌跡を示したいと思います。

1.検索をするための窓を用意する UITextField

検索するためには文字列を入力しなければなりません。するとまず考えられる部品として、TextFieldがあります。TextViewという選択肢もありますが、こんかいの場合はシンプルな窓としてTextFieldを選びました。iPhoneユーザーにとってはかなり当たり前に使ってる部品ですよね。

StoryboardやInterface Builder(以下IBと略します)を使う場合は部品をドラッグして設置し、controlキーを押しながらファイルとひも付けするというスタイルをとるので、設置や大きさに関する記述はいりません。ぼくの場合はコードで書いたので、

    [[UITextField alloc] initWithFrame:CGRectMake(35, 65, 250, 30)] ; //テキストフィールドの配置、サイズです

というコードを書きました。TextFieldを初期化でサイズまで設定し、設置しました。
StoryboardやIBは直感的な部品の配置をさせてくれます。初心者にとってはコードを書く手間が圧倒的に省けるので、最初は必ずと言っていいほどこれらから入ります。でも、どうして誰もがいつもStoryboardやIBを使わないんでしょうか?
少し脱線しますが、StoryboardやIBはとても優れたものだと思います。特にStoryboardは画面遷移を直感的にして、ビューとビューの関係性を初心者によりわかりやすく実装させてくれるツールだと思います。実際、私もよく使います。しかしたとえば、ビューの数が100個、あるいは1000個になった時にどうしますか?ボタンの数が1000個あったら?ひとつひとつドラッグして設置しますか?気が遠くなる作業になることは間違いないでしょう。
リファクタリングがしにくくなるなどの問題は初心者にはわかりにくいのでおいておいて、まずこの壁があるように思います。「え、ボタンを100個手動で設置しなくちゃいけないのかよ、だるいなー」って思うことからコードへの道が開けてくるのではないでしょうか。

2.URLで検索するためにURLエンコーディングがいるなーと思う

エンコードってご存知ですか?
エンコードする、デコードできるサイトにこういうのがありますー>http://www.tagindex.com/tool/url.html

ちなみに、Google検索をするときにどうしようかなーと思ったら、まず思い浮かんだのがクエリに埋め込むということです。検索日記ではエンコードした文字列を以下のように埋め込んでいます。

    NSString *urlStr = [[NSString alloc] initWithFormat:@"http://www.google.co.jp/search?q=%@",encoded_word]; //eleDataは検索した文字列を保持しておいたものです。前のビューから持ってきた文字列のこと。これは以前のビューでエンコードされてます。
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.wv loadRequest:request]; //wvはウェブビューの略で、自分でつけた名前です。

クエリに埋め込んでいるのがわかりますね。
これによって、ユーザが打ち込んだ検索ワード(文字列)が検索されるというわけです。

3.画面遷移がいりますよね Modal

検索をしてEnter(今回はSearchという表示になるように実装しています)を押すと、画面遷移して、Webビューに移ります。画面遷移にはaddSubviewやModalがありますが、今回は一時的にWebビューを表示するために使い、またホーム画面にすぐに戻ることを想定しているので、Modalを使います。

実装コードは、

    WebViewController *dialog = [[WebViewController alloc] init]; //WebViewControllerはWebビューの名前
    dialog.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    dialog.encoded_word = [NSString stringWithString:[Util urlencode:tf.text]]; //Utilというのはまだ解説してません
    [self presentModalViewController:dialog animated:YES];

WebViewController.hにはアクセサを通して、文字列の受け渡しをおこなっています。
「Util」というのがありますが、これについてはまだ解説をおこなっていません。エンコードをするための変換コードです。

このコードは、検索ワードを入力し、「Search」を押したときのメソッドの最後に呼ばれるように実装します。

4.検索結果を表示するWebViewController

Webビューを単純に表示するのは、iPhoneアプリに関する入門書に書いてあるのと同じ事です。

実装としては、

  • 「戻る」ボタンで戻る
  • 「前へ」ボタンで前へ
  • 更新ボタンで更新
  • 「ホーム」でModalを閉じる

という感じです。

複雑なことはありません。

5.UIViewControllerにTableViewをのせる

UIViewControllerにTableViewをのっけて使うっていうことは、意外に書籍に書かれてないように思うんです。なんでなんですかね。。。
たとえばテンプレのUITableViewControllerにUIButtonを設置しようと思うと、みんな困ると思うんですよ。各種入門書はなんで解説してないのか不思議です。

検索するための窓、TextFieldを設置して、その下に検索したワードを保存した一覧を出すには、UIViewControllerにTableViewを実装するしかないと思います。UITableViewControllerのテンプレを使うと、最初からTableViewに必要なメソッドが追加されたかたちで出てくるので、ビューにおいてTableViewしか実装にいらないのであれば選ぶと良いのではないのか、というのが私の印象です。

これのコードについても当ブログの「iPhoneデータベース入門」で今後解説しますが、簡単にいうと、自分でUITableViewをつくるわけですね。そして検索日記で書いた雰囲気は、

    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 100, 320, 365) style:UITableViewStyleGrouped];
    _tableView.dataSource = self;
    _tableView.delegate = self;
    [self.view addSubview:_tableView];

実際には、hファイルで宣言して、プロトコルも宣言してます。
これについては後日コードを示しますので、先に進みます。

6.検索した日にちを取得する


検索した日にちを取得、保存し、それをセクションのタイトルにしています。

データベース上のタイムスタンプを使ったのかと思われるかもしれませんが、iOS上から日本時間を取得し、それをデータベースにいれて管理するというかたちをとっています。

コードとしましては、

    NSDate *today = [NSDate date];
    NSLocale *locale_ja = [[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] ;
    NSDateFormatter *formatter = [[[NSDateFormatter alloc]init] autorelease];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setLocale:locale_ja];
    NSString *strTime = [[NSString alloc] initWithFormat:@"%@",[formatter stringFromDate:today]];

NSDateとNSLocaleで日本時間を取得して、最終的にはNSString型という文字列で取得しています。
これをデータベースに差し込みます。

7.データベースに保存、取り出し

そして、最終的にはデータベースを使って保存、取り出しの作業になります。

これはiPhoneデータベース入門のPart.1でも解説しましたように、FMDBを利用してSQLite、という感じです。

そして、SQL文を使って、insertとselectを繰り返すんですね。


では、また次回。


次回最終章:iPhoneデータベース入門(SQLite)終わりの始まり FMDBを使った「検索日記」のソースコード解説


iPhoneデータベース入門記事一覧
iPhoneデータベース入門(SQLite)Part.1 FMDBでSQLiteを扱う準備をしよう
iPhoneデータベース入門(SQLite)Part.2 Xcode4.3.2でFMDBを使ったアプリをつくる
iPhoneデータベース入門(SQLite)Part.3 「検索日記」を実装するにあたっての考え方
iPhoneデータベース入門(SQLite)終わりの始まり FMDBを使った「検索日記」のソースコード解説


======================
当ブログ管理人のツイッターこちら
◎フォローしてくださると泣いて喜びます!ツイッター上で当ブログの質問などにもできるだけお答えしますし、役に立つiPhoneアプリ開発情報もつぶやきます。個人的なご依頼(たとえば、プログラミングの家庭教師、Skypeレッスンをしてくれないか、iPhoneアプリ開発の勉強会ってやってるの、とかですね)でもかまいません。
スカイプレッスンについて
開発をしているとその都度ぶつかる問題があると思いますが、検索で調べてもなかなかわからない、あるいは調べても非常に時間がかかる場合があると思います。開発者のみなさんもお忙しいと思いますので、私のレッスンを受けながら開発を進めていただけると、大幅にお時間を短縮できます。加えて、iPhoneアプリ開発の基礎、応用が身につき、今後の開発もスムーズに進められます

お問い合わせはツイッター、またはhiyoshimarukoアットマークgmail.comまでお願いします。(アットマークを@にしてください)お待ちしております!