2012-05-23 9 views
13

Stanford 193P iTunesのiPhoneコースのコアデータ講義では、講師がNSPersistentStoreCoordinatorを使用せずにCore Dataを使用したサンプルプロジェクトをコーディングし、NSManagedObjectModelをロードしました。しかし、iPhone開発に関する他のコードサンプルやBig Nerd Ranchの本を見ると、彼らはNSManagedObjectModelとPersistentStoreCoordinatorを作成し、そのようにNSManagedObjectContextを設定しています。NSPersistentStoreCoordinatorを使用するポイント?

私の質問は、このようにすることの目的は何ですか、両方のアプローチの賛否両論は何ですか?

答えて

18

私は同じ講義シリーズに非常によく従っていました。この特定の例では、Flickrからデータ(Photographers and Photos)を取得し、CoreDataにロードします。このアプリケーションではCoreDataを使用する必要はありませんでした。アプリケーションロードごとにflickrから新しいデータを取得する必要があるため、永続的に保存する必要はありません。以前のデモのアプリを読み込むflickrを使用していたのは、学生が既にそれに精通していた(CoreDataの説明に集中できるようにしたため)。しかし、リックスターが言及したように、ディスクにコンテキストを保存せずにコアデータを使用することには大きなメリットがあります。

パウロは、デモの前に講義で説明したように、コアデータベースは、いずれかによって(iOS5をして)作成することができます:新しいプロジェクトを作成するときにアプリテンプレート用

  1. クリックする「使用コアデータ」。
  2. UIManagedDocument

を使用して最初のアプローチの背後にある考え方は、Xcodeのは、あなたのドキュメントディレクトリ/永続ストアコーディネータ/およびモデルを設定するAppDelegate内のコードの束を置くということです。次に、管理されたオブジェクトCONTEXTを初期ビューコントローラ(パブリックAPIにNSManagedObjectContextプロパティが必要です)に渡します。そこから、他のViewControllerにセグメンテーションするときにビールのようなコンテキストを渡すことができます。コンテキストを回すことは、コアデータベースにアクセスするための正しい手順です。

あなたのAppDelegateが残されていることを除いて、UIManagedDocumentの使い方は非常に似ています。あなたのアプリケーションのドキュメントディレクトリからのURLパスを使用してUIManagedDocumentを作成します(注:ファイルが既に存在しているか、存在しているか、開いていないか、または存在していないかどうかを手動で確認する必要があります)。次に、上記と同じ方法でこの文書のコンテキストを使用することができます。

別の注:AppDelegateでコンテキストへのポインタを作成して、アプリケーションがクラッシュしたり終了したときにコンテキストを明示的に保存できるようにすることをお勧めします。

persistent storeコーディネータは自動的に設定され、persistentStoreOptionsプロパティを使用して設定できます(実際にはコンテキストを永続的に保存する必要があります)。またはUIManagedDocumentをサブクラス化して、必要なメソッドをオーバーライドする必要があります。

は、どちらの方法が同じように動作し、同じ制御とアクセスを提供UIManagedDocumentドキュメント http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIManagedDocument_Class/Reference/Reference.html

で概要をお読みください。 UIManagedDocumentsを使用すると、複数のデータベースを複数のsqliteファイルで作成することができます。必要になるまでデータベースの作成/設定を待つこともできます。 「コアデータを使用する」オプションは、アプリケーションのロード時に設定する単一のコアデータベースを提供し、AppDelegateの周りにCoreDataを集中化し、コーディング時間を節約し、高速トラックアプリケーションに適しています。私はUIManagedDocumentが好きです。

コアデータオプションがチェックされていない状態でアプリを起動し、AppDelegateに追加したい場合は、コアデータをチェックして新しいプロジェクトを作成し、すべてのコードをAppDelegateにコピーしてくださいドキュメントディレクトリにアクセスするための便利な方法もあります)。

更新日: ちょうど他の便利さを追加したいと思います。管理対象オブジェクトコンテキストは、あなたのappDelegateに格納されている場合は、あなただけの

NSManagedObjectContext* context = [[(AppDelegate*) [UIApplication sharedApplication] delegate] myManagedObjectContext]; 

を使用して、アプリでどこでもアクセスすることができ、これは、それを周りに渡すために持っ否定します。

CoreDataアプリケーションの場合、モデルを変更する場合は、シミュレーションを再構築する前に、シミュレータでアプリを手動で削除してください。それ以外の場合は、古いファイルを使用するため、次のビルドでエラーが発生します。

+0

長年の答えの上に、AppDelegateのバックポインタを使用して、どこからでもコンテキストを取得するようにしましたが、推奨アプローチではありません。 – Patrick

+0

絶対に光り輝く答えです。それに加えて、UIManahegDocumentを保存するためのコードスニペットがここにあります:[document.HttpRequest:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL]; – brainray

7

永続的なストアコーディネータがなければ、結果を永続的な領域(データベース、ファイルなど)に保存することはできません...永続的なデータマネージャが完全に役に立たないようにするには、NSPersistentStoreCoordinatorを省略します。プロジェクトで使用していないと確信していますか?教授はどのようにデータを保存しましたか?新しいコアデータプロジェクトを作成すると、このロジックは自動生成されます。

編集:教授はUIManagedDocumentを使用しています。これは独自の永続的なストアコーディネータを内部的に(ファイルタイプに基づいて)使用するため、明示的に作成する必要はありません。デフォルト)。ですから、最終的にコーディネーターを使用するかどうかではなく、明示的に作成するかどうかです。

+0

はい私は教授がそれを使用していないと確信していますが、[NSEntityDescription insertNewObjectForEntityForName]を使用してオブジェクトをコアデータに格納していました。ロジックはどこで自動生成されますか?ありがとう – user1337645

+0

あなたのApp Delegateでは、私は信じています。コンテキスト上で「保存」を呼び出すときに使用するストアコーディネーターを設定します。もし彼がその機能を使用していなかったなら、なぜコアデータに気をつけなければならないのでしょうか... ... – borrrden

+0

コアデータには、管理対象オブジェクトコンテキスト、管理対象オブジェクトモデル、および永続ストアコーディネータが必要です。 (あなたが参照する 'insertNewObject ...'メソッドは、コンテキストをパラメータとし、コンテキストにはストアが必要であり、ストアにはモデルが必要です。)あなたがおそらく講義で見たのは、テンプレートプロジェクトの使用でした。新しいXcodeプロジェクトを作成し、 "Use Core Data"を選択すると、 'AppDelegate'実装はこれを設定するための定型コードを取得します。 – rickster

関連する問題