Study CoreData 10 ~Todoアプリ開発本格始動!!~

2010年7月10日にスタートした『Study CoreData』ですが、
このエントリから『第二部』開幕でっす!

今日も果敢にCoreDataに挑んでいきましょ〜!
 
 
前回までで、おそらく
大まかな流れは掴めてきたんぢゃないかなぁ?と思うので、
今回はいよいよみなさんお待ちかねの

『Todoアプリ開発本格始動』

となります!

言わばココまでの回は、なが〜〜〜〜い前置き
ってコトで、より実践的なコーディングに入っていきますよ。
 
楽しくなってきましたね \(^O^)/

では、早速まいりましょ〜〜!

注意:投稿者自身もCoraDataについて勉強中のため、このシリーズには誤りが含まれている可能性があります。もし、間違いに気付かれた方はコメント欄もしくはtwitterなどでご指摘いただけると幸いです<(_ _)>
また、開発環境はXcode3.2.3 iPhone SDK 4です。実機でのテストなどは自己責任でお願いいたします。

 
 

1. 新たなプロジェクト始動っ!

前回までのTodoCoreプロジェクトは、飽くまでお勉強用のプロジェクトでしたので ちょっともったいない気はしますが、心新たに新規プロジェクトを作成していきたいと思います。

そのプロジェクト名は…
『DoTodo』(アプリ名は”dotodo”)
 
 
そう!
『Study CoreData 0』で公開したデモ動画に使っていたあのアプリです!!
(ちなみにアプリ名は字ヅラだけで決めました^^;)

まずは、始めにやったように
[Use Core Data for Strage]な[Navigation-Based Application]を新規作成して
諸々の設定をした『DoTodo』プロジェクトを用意してください。

そして、今回はデバッグログ出力用にNSLogに変わるマクロを入れてみましょう。
(記事内でデバッグログを示す事はほとんどないと思いますが、何か不具合があった時に各自使ってみてください。)

これがそのマクロです。

//デバック用マクロ。LOG_CURRENT_METHOD;で表示
#ifdef DEBUG
//#if (TARGET_IPHONE_SIMULATOR)
#  define LOG(...) NSLog(__VA_ARGS__)
#  define LOG_CURRENT_METHOD NSLog(@&quot;%@/%@&quot;, NSStringFromClass([self class]), NSStringFromSelector(_cmd))
#else
#  define LOG(...) ;
#  define LOG_CURRENT_METHOD ;
#endif

コイツを[DoTodo_Prefix.pch]の最後辺りに入れて、次のように設定します。

プロジェクトファイルをWクリックして
[ビルド]タブの検索フィールドに”プリプロ“と入力し、[プリプロセッサマクロ]の[値]に”DEBUG”を追加します。

これで、今まで使っていた

NSLog(@"test = %@", test);

の代わりに

LOG(@"test = %@", test);

// クラス名とメソッド名をログ出力
LOG_CURRENT_METHOD;

といった感じで使えるようになります。
(ちなみにコメントアウトしている部分を外して[#ifdef DEBUG]をコメントアウトすると、シミュレータでのデバッグ時のみログを出力して実機の時は出力しないようにも出来ます。)
 
 
このマクロは以下を参考にさせて頂きましたので、詳しくはそちらをごらんください。
iPhoneデバッグ用のマクロで、クラス名とメソッド名を自動的にログ出力する – 24/7 twenty-four seven
iPhone デバッグ用のマクロ – Windchase
 
 
マクロを追加したら次は、下のように[Bundle display name]を”dotodo”に変更してみてください。

これで表示されるアプリ名は『dotodo』になりましたね。
 
さらに今回はよりアプリを作っている実感が湧くように、画像リソースも用意してみました。
こちらもダウンロードしてプロジェクトに追加してみてください。
※Zipでのアップが出来なかったので、お手数ですが手動([option]+クリックなど)で画像を保存してください。


(サンプル用のため若干作り込みが甘いです…<(_ _;)>)

※もし、Jacminikにアプリ(アイコンのみでも可)のデザインを依頼したい!という希少な方がおられましたら、このサイトの“DesignWorks”ページをごらんくださいませ。
 
…とドサクサまぎれの宣伝でした…(^〜^;)ゞ

 
リソースファイルを追加したら、一応アイコンのグロス(テカリ)を消しておいてください。

Info.plistに
[Icon already includes gloss effects]を追加してチェックを入れるだけです。

どうでしょう?

なんとなく
『これからアプリ作るぞっ!』
的な感じになってもらえたらウレシいです。

 
 
そこまで出来たら一応ビルドしてちゃんと起動するか確かめておいてくださいね。
確認できたら、これからデータモデルを変更していくので
シミュレータからアプリを削除しておいてください。
 
 

2. NSManagedObjectのサブクラス

次に、今まで10日ほど共に旅をしてきた『TodoCoreプロジェクト』も開いてください。

そして、新しいDoTodoのデータモデルエディタから[Event]エンティティを削除して、TodoCoreの3つのエンティティ(Task, Tag, Category)をコピペします。

(見やすいように調整してくださいね。)

無事コピーできたら、古いプロジェクトは閉じてOKです。
 
 
そして、次に今回初めて
NSManagedObjectのサブクラスを用意してみましょう!

次のようにします。

データモデルファイルのすべてのエンティティを選択した状態で、右クリック→追加→新規ファイル…

すると
[Managed Object Class]というファイルが表示されるのでそれを選択します。

次の画面ではそのまま[次へ]

以下の画面ではサブクラス化するエンティティにチェックを入れます。
(今回はすべてにチェックして[完了])

すると、3つそれぞれのクラスのファイルが自動的に生成されるはずです。

いや〜、ホントに楽チンですねぇ♬
 
 
って事でとりあえず、自動生成されたファイルの中身を覗いてみることにしましょう。
 
 

3. 一石二鳥

[Task.h]は…っと

見て分かる通り、それぞれの属性と関連がObjective-Cの型で書かれていますが
ハイライトされているところは[Relationship](関連)のプロパティになります。

[Category]はそのままですが、
[Tag]は[NSSet]になっていてさらに
[CoreDataGeneratedAccessors]というアクセサメソッドが用意されていますね。
 
 
つまり、[tags]に値を入れる時などは
[Task setValue:xxxx forKey:@”tasks”];
とかではなくって、このアクセサメソッドを使えという事みたいですね。

ちなみに4つのメソッドの内、
上の2つがひとつの[Tag]オブジェクトに対するメソッドで
下の2つが[tags]全体に対応するもののようです。

ここでちょこっと提案なのですが、
KVCで使う@”xxxx”ってメンドイと思いません?

僕はホンットに面倒くさがりなので、こうしちゃいました。

こんな風にすべてのエンティティとそのキー
さらにcategoryのデフォルト値“No Category”を[#define]しておけば
入力補助も使えるうえにタイプミスも防げるし、一石二鳥っ!!
 
なので、今回はコイツを使って楽させて頂きたいと思います^^;
 
 
んじゃ、早速[RootViewController]の
[-(NSFetchedResultsController *)fetchedResultsController]を変更してみましょう。

変更点は以下。

・ NSEntityDescriptionの[entityForName:]をTaskに。
・ ソート順は…(優先度が高い項目順)
  1. completed:NOを先に。
  2. dueDate:古い日付を先に。
  3. priority: 重要度が高い方を先に。
  4. created:新しい日付を先に。
・セクションはcategory別にする。

[dueDate]でのソートに関しては、本来なら
『今日を過ぎているかどうか?』
でも分岐したいところですが、
ちょっと複雑になってしまうので、今回は上の形でいくことにしました。
 
 
それでは、やってみてくださいね。
 
 
こんな感じですかね?

上と同じ書き方をした場合は、忘れずに[ソートデスクリプターのリリース]を削除しておいてくださいね。
※誤りがあったので修正してあります。
 
 

4. アプリの設計デザイン

今回のプロジェクトは、実際にアプリを作る時と同じように
まず全体像を決めてから、それを元に進めていこうと思います。

僕がこのプロジェクトに取りかかる前に書いた設計(ラフ)はこんな感じです。
(ホンットにラフすぎるラフですが…^^;)

で、実際の各ビューはこんな感じになります。

 
 
ここまで全体像が決まれば、あとはそのために必要なクラスを用意していけばOKですよね。

それじゃ、今の時点で最低限必要だと思われるクラスファイルを先に追加しておくことにしましょうか。

・DetailViewController
・EditableViewController
  (titleとdueDateの編集用)
SelectableListViewController SelectableViewController
  (categoryとtagの編集用)
・EditValueController
  (上記2つの編集用コントローラの親クラス)
・ListViewCell
  (RootViewで使用するカスタムUITableViewCell)
・DTDValueCategorys
  ([valueToString]を実装するカテゴリ用クラス)

(各ViewControllerは簡略化のため、すべてUITableViewControllerのサブクラスにしてます。)

[追記:編集用コントローラの名前が間違っていたので修正しました<(_ _)>]
 
他にも今後加えていく必要は出てくると思いますが、
とりあえず今のところはこんな感じでしょうか。
 
 
かなり中途半端ですが、長くなってしまったので今回はここまで

ってことで、とりあえず上のクラスをプロジェクトに加えておいてくださいね。
 
 
今回から、実際に『Todoアプリ』を作り始めたワケですが
みなさん、いかがでしょうか?

正直、前回までのおさらい的な部分も多くなってくるので

ちょっと退屈だなぁ〜。

って感じる方も多いかもしれませんね(^〜^;)

ただ、一度得た知識を改めて使ってみると
より理解が深まることもあると思いますし、
その辺りは目をつむってやって頂けると助かります
 
 
そして、次回は
『各ViewControllerの実装』に入っていきたいと思います。

恐らく、もうそろそろ折り返し地点くらいまで来たんじゃないでしょうか?

まだラストスパートには早いので、のんび〜りやっていきましょ。
 
 
では、またあしたも気楽に行きましょう!
 

広告

Study CoreData 10 ~Todoアプリ開発本格始動!!~」への2件のフィードバック

  1. ピンバック: Tweets that mention Study CoreData 10 ~Todoアプリ開発本格始動!!~ « Everything was born from Love -- Topsy.com

  2. ピンバック: [朝刊] アップルをモチーフにした iPad 用壁紙10個。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中