13

iTunesのStanford193PiPhoneコースのCoreData講義では、インストラクターは、を使用NSPersistentStoreCoordinatorしてロードせずに、CoreDataを使用してサンプルプロジェクトをコーディングしましたNSManagedObjectModel。しかし、他のコードサンプルとiPhone開発に関するBig Nerd Ranchの本を見ると、彼らはNSManagedObjectModelPersistentStoreCoordinatorを作成し、そのように設定してNSManagedObjectContextいます。

私の質問は、このようにする目的は何ですか、そして両方のアプローチの長所と短所は何ですか?

4

2 に答える 2

19

私は同じ講義シリーズを非常に密接にフォローしました。この特定の例では、Flickrからデータ(写真家と写真)を取得し、CoreDataにロードします。このアプリでは、アプリケーションをロードするたびにflickrから新しいデータをフェッチする必要があるため、CoreDataを使用する必要はありませんでした。したがって、永続的に保存しても意味がありません。教授は、学生がすでに慣れているので、前のデモのflickrフェッチアプリを出発点として使用していました(CoreDataの説明に集中できるようになりました)。ただし、ricksterが述べたように、コンテキストをディスクに保存せずにコアデータを使用することには大きなメリットがあります。

Paulがデモの前の講義で説明したように、コアデータベースは(iOS5で)次のいずれかによって作成できます。

  1. 新しいプロジェクトを作成するときに、アプリテンプレートの[コアデータを使用]をクリックします。
  2. UIManagedDocumentの使用

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

UIManagedDocumentの使用は、AppDelegateがそのままになっていることを除いて、非常によく似ています。アプリのドキュメントディレクトリからのURLパスを使用してUIManagedDocument(おそらく最初のView Controllerで)を作成します(注:ファイルが既に存在するか、存在するが開いていないか、存在しないかを手動で確認する必要があります)。次に、上記と同じ方法でこのドキュメントのコンテキストを使用できます。

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

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

UIManagedDocumentドキュメント http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIManagedDocument_Class/Reference/Reference.htmlで概要をお読みください

どちらの方法も同じように機能し、同じ制御とアクセスを提供します。UIManagedDocumentsを使用すると、複数のsqliteファイルに複数のデータベースを作成できます。また、必要になるまでデータベースの作成/セットアップを待つこともできます。「コアデータの使用」オプションは、アプリケーションのロード時にセットアップする単一のコアデータベースを提供し、AppDelegateを中心にCoreDataを一元化できるようにし、コーディング時間を節約し、ファストトラックアプリに適しています。UIManagedDocumentが好きです。

コアデータオプションをチェックせずにアプリを起動し、それをAppDelegateに追加したい場合は、コアデータをチェックして新しいプロジェクトを作成し、すべてのコードをAppDelegateにコピーします(3つのプロパティとそのアクセサー、およびドキュメントディレクトリにアクセスするための便利な方法)。最初のViewController、モデルなどを指す必要があります。

更新:もう1つの便利さを追加したかっただけです。管理対象オブジェクトのコンテキストがappDelegateに保存されている場合は、を使用するだけでアプリ内のどこからでもアクセスできます。

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

これはそれを回す必要をなくします。

CoreDataアプリの場合、モデルに変更を加えた場合は、再度ビルドする前に、必ずシミュレーターでアプリを手動で削除してください。そうしないと、古いファイルが使用されるため、次のビルドでエラーが発生します。

于 2012-05-31T14:51:55.390 に答える
7

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

編集:私は今それを手に入れました、教授はUIManagedDocumentを使用しています。これは(ファイルタイプに基づいて)内部で独自の永続ストアコーディネーターを使用するため、明示的なものを作成する必要はありません(デフォルトに満足していない場合を除く)。つまり、結局のところ、コーディネーターを使用するかどうかではなく、明示的に作成するかどうかです。

于 2012-05-24T01:14:55.223 に答える