トップページ | iphone 開発 サンプル「CoreDataBooks」を読む。2 »

2010年6月23日 (水)

iphone 開発 サンプル「CoreDataBooks」を読む。 1

サンプル「CoreDataBooks」を読む。

「概要」
iphoneアプリの開発者向けサイトのサンプル「CoreDataBooks」を参照する。

ソースを読んだ時系列にメモしていくので、疑問点(?)などもそのままかいている。

以下の文は、CoreDataBooksを読もうとしている人以外には、情報がないと思う。

また、間違いもたくさんあると思う。鵜呑みにしないようにご注意を。

「ファイル構成」
CoreDataBooksAppDelegate.{h,m}
Core Data Stackと、最初のview controllerを設定する。

RootViewController.{h,m}
本のテーブルビューを管理する。本の追加と削除を提供する。

DetailViewController.{h,m}
1つの本の詳細表示を管理する。

AddViewController.{h,m}
新規の本オブジェクトを管理するための、DetailViewControllerのサブクラス

EditingViewController.{h,m}
データを編集するためのビュー

Book.{h,m}
本を表現するmanaged object クラス

CoreDataBooks.sqlite
データベース。初回起動時に適切な場所にコピーされる。

CoreDataBooks.xcdatamodel
Core Data managed object model

「継承関係」
RootViewController : UITableViewController
全タイトルをリスト表示するため、テーブルビューコントローラ
DetailViewController : UITableViewController
タイトル/著者/コピーライトをリスト表示するため、テーブルビューコントローラ
AddViewController : DetailViewController
EditingViewController : UIViewController
 タイトル/著者/コピーライトのいずれかを入力する単票画面

「ヘッダファイルの特徴」
RootViewController.h
CoreData関連のプロパティが多数。外からこれらを操作するのか?
メソッド:addBookがある。本を追加したときどう処理するのか?

DetailViewController.h
プロパティ:Bookがある。詳細表示する本をもつ。ここに値をいれるのはいつ、どうやって?
NSUndoManagerがある。何をUndoするのか?

AddViewController.h
AddViewControllerDelegateプロトコルを実装するdelegateクラスをもつ。
これはメソッド:addViewControllerの実装を要求する。このメソッドの中身は?

EditingViewController.h
 編集用の入力フィールドを持つ。
 NSManagedObjectを持つ。これをだれが、いつ、どのように操作するか。
 メソッド:cancel,saveを持つ。saveでcore data関連オブジェクトへのアクセスが行われる?

Book.h
タイトル、著者、コピーライトを保持する。

CoreDataBooksAppDelegate.h
ここにもRootViewController.hと同じようなCoreData関連のプロパティが多数。関連は不明

比較する。
CoreDataBooksAppDelegate.h)
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;

RootViewController.h)
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
NSManagedObjectContext *addingManagedObjectContext;


「処理」
まず、初期化処理

○CoreDataBooksAppDelegate.m

メソッド:applicationDidFinishLaunchingにRootViewControllerの
managedObjectContextセット処理がある。同じものを共有している模様。

navigationControllerのトップビューとして、RootViewControllerをセットする処理は、
MainWindow.xibで行っているため、ソースにはセット処理はない。

上記CoreData関連のゲッターでオブジェクトの初期化処理があり、Contextにsqliteのデータを
ひも付けしている模様。

Context と、Persistent object と、Fetchの関係がよくわからない。
「 Core Data Programming Guide」を読む。

Fetchによって、Persistent objectが Context にロードされるらしい。

○RootViewController.m
メソッド: viewDidLoadでデータのフェッチを行っている模様。
fetchedResultsControllerの初期化はどこ?
→fetchedResultsControllerのゲッターで行っている。
 ここで取り出すエンティティとソート順を決めている。

画面への表示部分は、メソッド:configureCellにより、fetchedResultsControllerから情報を取り出している。

詳細画面への遷移は、メソッド:tableView:didSelectRowAtIndexPath:のところ。該当する本をフェッチ結果から取得して渡している。

○DetailViewController.m
タイトル/著者/コピーライトの3つをリスト表示している。
undoManagerの使われ方がわからない。持ち越し。
メソッド:tableView:didSelectRowAtIndexPath:で、どの要素を編集するか決定し、EditingViewControllerに遷移する。
その際、editedObjectをセットしている。これにより、本の情報を渡している。

○EditingViewController.m
メソッド:saveにより、editedObjectを修正している。これにより、呼び出し元に情報が渡される。
popViewControllerAnimatedで、画面をもとに戻す。

今のところ、メモリ(Context)上の変更だけで、ファイルへの書き込みはまだだと思う。

○RootViewController.m
メソッド:addBookでAddViewControllerを生成し、遷移する。delegateにselfを渡している。
何かRootViewControllerの持っているメソッドを実施する模様。
別のcontext(addingManagedObjectContext)が必要な理由がわからない。

と思ったら、メソッド:addViewController:didFinishWithSaveにコメントで説明が。
翻訳)
新規の本は新規のコンテキストと関連していんだ。
これはメインのコンテキストへの影響を与えない点で良いことだ。
しかしこのことは、新規の本をフェッチコントローラから取得することを困難にするんだ。
まず、新規の本をsaveしよう。これで永続的なストアに追加されるんだ。

今日は、ここまで


それで、アプリケーションのデリゲートコンテキストにmanaged objectを取って入れることができるんだ。

(やり方の例)

ただ、このやり方だと、変更通知を監視しているフェッチ結果コントローラを更新しない。
あなたは負荷の高いフェッチのやり直しを望んでいない。
あなたは、メインコンテキストの更新をmergeChangesFromContextDidSaveNotificationで行うことができる。


|

トップページ | iphone 開発 サンプル「CoreDataBooks」を読む。2 »

iphone開発」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1049865/35430743

この記事へのトラックバック一覧です: iphone 開発 サンプル「CoreDataBooks」を読む。 1:

トップページ | iphone 開発 サンプル「CoreDataBooks」を読む。2 »