NSManagedObjectクラス

2011. 04. 24
●概要

NSManagedObjectは、Core Dataモデルオブジェクトの要求する全ての基本的な動作を実装する包括的なクラスです。

管理オブジェクトコンテキストに、NSObject(またはNSManagedObjectから継承されていないその他のクラス)のサブクラスの直接のインスタンスを使用することはできません。

NSManagedObjectのカスタムサブクラスを生成することはできますが必ずしも必要ではありません。

カスタムロジックが必要でない場合、NSManagedObjectインスタンスに沿った完全なオブジェクトグラフの形式にすることができます。

管理オブジェクトは、(オブジェクトを表すエンティティの名前、およびその属性と関係の名前を含む)オブジェクトに関するメタデータを提供するエンティティ記述(NSEntityDescriptionのインスタンス)と、オブジェクトグラフへ変更の足跡を残す管理オブジェクトコンテキストを関連付けします。

管理オブジェクトは、Core Dataで使用できるよう適切に構成されていることが重要です。

管理オブジェクトを直接インスタンス化する場合は、指定イニシャライザ(initWithEntity:insertIntoManagedObjectContext:)を呼び出す必要があります。


データストレージ

いくつかの点で、NSManagedObjectは辞書のように動作し、関連付けられたNSEntityDescriptionオブジェクトによって定義されたプロパティのストレージを効率的に提供する、汎用的なコンテナオブジェクトです。

NSManagedObjectは文字列を含む日付、数値といった属性値の一般的な型の範囲をサポートしています。
(詳細についてはNSAttributeDescriptionを参照してください)

したがって、一般的にサブクラスでインスタンス変数を定義する必要はありません。

しかし時には、色やC構造体など、直接サポートしていない型を使用する場合があります。

例えばグラフィックスアプリケーションで、NSColorとNSRect構造体それぞれのインスタンスである色と領域の属性を持ったRectangleエンティティを定義したい場合があります。

いくつかの型は属性を変換して使用できますが、それ以外はNSManagedObjectのサブクラスを生成する必要があります。
(『Non-Standard Persistent Attributes』を参照)


フォールティング

管理オブジェクトは通常、永続ストアが保持するデータを表します。

いくつかの状況では、管理オブジェクトが『フォールト(オブジェクトのプロパティ値が外部データストアからまだ読み込まれていない)』の場合があります。
(詳細は『Faulting and Uniquing』を参照してください)

永続的なプロパティ値にアクセスを試みた場合、フォールトが『発動』し、自動的にストアからデータを取得します。

これは比較的高くつく工程なので(潜在的に永続ストアへのデータの往復が必要になる)、無用なフォールトの発動は回避したいと思うかもしれません。

フォールトを発動させず安全に呼び出すことができるメソッドは、次の通りです。
isEqual:、hash、superclass、class、self、zone、isProxy、isKindOfClass:、isMemberOfClass:、conformsToProtocol:、respondsToSelector:、retain、release、autorelease、retainCount、description、managedObjectContext、entity、objectID、isInserted、isUpdated、isDeleted、faultingState、isFault。

isEqualとhashはフォールトが発動しないので、管理オブジェクトは通常フォールトを発動させずにコレクションに置くことができます。

ただし、コレクションオブジェクトでキー値コーディングメソッドを呼び出すと、管理オブジェクトでvalueForKey:が呼び出されてされて結果を返すため、フォールトが発動します。

descriptionメソッドでフォールトは発動しませんが、オブジェクトの永続プロパティにアクセスするカスタムdescriptionメソッドを実行した場合は、フォールトが発動します。

この場合、descriptionをオーバーライドすることは強く推奨しません。


サブクラス化の注意

管理オブジェクトモデル内のエンティティ記述の組み合わせでは、NSManagedObjectは任意のプロパティと値の検証のサポートを含む、デフォルト動作の豊富なセットを提供します。

しかし、NSManagedObjectのサブクラスにカスタムな機能の実装を望む理由は多いでしょう。

ただし、Core Dataの動作を混乱させないことが重要です。


オーバーライド不可のメソッド

NSManagedObject自体は、管理オブジェクトがCore Dataのインフラストラクチャに適切に統合できるように、NSObjectの多くの機能がカスタマイズされています。

Core DataはNSManagedObjectの以下のメソッドの実装に依存しているので、絶対にオーバーライドしないでください。
primitiveValueForKey:、setPrimitiveValue:forKey:、isEqual:、hash、superclass、class、self、zone、isProxy、isKindOfClass:、isMemberOfClass:、conformsToProtocol:、respondsToSelector:、retain、release、autorelease、retainCount、managedObjectContext、entity、objectID、isInserted、isUpdated、isDeleted、isFault。

上記のメソッドに加えMac OS X v10.5以降でオーバーライドしてはいけないメソッドは以下の通りです。
alloc、allocWithZone:、new、instancesRespondToSelector:、instanceMethodForSelector:、methodForSelector:、methodSignatureForSelector:、instanceMethodSignatureForSelector:、isSubclassOfClass:。


オーバーライド非推奨のメソッド

任意のクラスと同様に、willChangeValueForKey:didChangeValueForKey:withSetMutation:usingObjects:などのキー値を観察するメソッドのオーバーライドは強く推奨しません。

descriptionのオーバーライドは推奨しません。
(このメソッドはデバッグ処理中にフォールトが発動した場合、結果が予測できなくなります)

またinitWithEntity:insertIntoManagedObjectContext:、dealloc、finalizeのオーバーライドも推奨しません。

initWithEntity:insertIntoManagedObjectContext:メソッドで値を変更する際はコンテキストによって通知を行うよう注意を払わないと、変更は保存されません。

ほとんどの初期化のカスタマイズは、いずれかのawake...メソッドで実行する必要があります。

initWithEntity:insertIntoManagedObjectContext:をオーバーライドする場合、メソッド記述の必要条件に準拠しているかを確認する必要があります。
initWithEntity:insertIntoManagedObjectContext:を参照)

通常didTurnIntoFaultは値のクリアにdeallocやfinalizeより多くの時間がかかるので、オーバーライドは推奨しません。
(管理オブジェクトがフォールトになった後は、しばらくの間再利用できない場合があります)

Core Dataは、(アプリケーションの終了時など)全てのシナリオでdeallocまたはfinalizeのどちらかを呼び出すことを保証するものではありません。

したがって、これらのメソッドに含まれている(ユーザのプリファレンスやファイルシステムへの保存や変更などの)副作用を必要とするべきではありません。

要約すると、initWithEntity:insertIntoManagedObjectContext:、dealloc、finalizeのためには、Core Dataは管理オブジェクトのライフサイクルが終わるまで(つまり、生のメモリ管理を)排他的に制御を確保することを念頭に置くことが重要です。

これはフレームワークが、一意化や結果による関係の維持だけでなく、他の候補よりも遥かにより良い性能を提供できるようにするためです。


メソッドをオーバーライドする際の考慮

以下のメソッドは、きめ細かくて大規模な処理を行わないことを意図しています。

これらのメソッドでフェッチや保存をしてはいけません。

特に、管理オブジェクトコンテキスト上で副作用を利用するべきではありません。

・initWithEntity:insertIntoManagedObjectContext:
・didTurnIntoFault
・willTurnIntoFault
・dealloc
finalize

更にメソッドはオーバーライドすべきではなく、オーバーライドする場合は最初にスーパークラスを呼び出す必要があり、それにはawakeFromInsert、awakeFromFetch、および準拠するメソッドを含みます。

awakeFromFetchの関係は変更しないよう注意してください。
(詳細はメソッドの説明を参照してください)


カスタムアクセサメソッド

通常、管理オブジェクトに対応する管理オブジェクトモデルの、エンティティで定義されているプロパティのカスタムアクセサメソッドを記述する必要はありません。

それを望む、あるいは必要がある場合、従わなければならないいくつかの実装パターンがあります。

これらは『Core Dataプログラミングガイド』の『管理オブジェクトのアクセサメソッド』で説明されています。

Mac OS X v10.5では、Core Dataは自動的にアクセサメソッド(とプリミティブアクセサメソッド)を生成します。

属性と一対一の関係では、Core Dataは標準のゲットとセットのアクセサメソッドを生成し、一対多の関係では、Core Dataは『キー値コーディングプログラミングガイド』の『キー値コーディングのアクセサメソッド』で説明されているようにインデックス付きのアクセサメソッドを生成します。

ただしコンパイラの警告を抑制するため、アクセサメソッドを宣言するか、またはObjective-Cプロパティを使用する必要があります。

完全な説明については、『Core Dataプログラミングガイド』の『管理オブジェクトのアクセサメソッド』を参照してください。

Mac OS X v10.4では、valueForKey:などの標準のキー値コーディングメソッドを使用して、プロパティにアクセスすることができます。

ただし、コンパイル時の型チェックやスペルを間違えたキー名を回避するためには、カスタムアクセサを実装すると便利です。


カスタムインスタンス変数

デフォルトでは、NSManagedObjectはオブジェクトとして内部構造にプロパティを格納しており、一般的にCore Dataは、カスタムインスタンス変数を使用するよりも独自の制御下にあるストレージで作業する方がより効率的です。

NSManagedObjectは、文字列を含む日付、数値といった属性値のための、一般的な型の範囲のサポートを提供します。
(詳細はNSAttributeDescriptionを参照してください)

色やC構造体など直接サポートしていない型を使用する場合は、『Non-Standard Persistent Attributes』で説明されているように、変換可能な属性またはNSManagedObjectのサブクラスの生成のどちらかを使用することができます。

例えば描画アプリケーションなどで、頻繁に計算で使用する大きさを表す変数としてxとy座標をスカラー値として変数を表すと便利です。

スカラー値として属性値を表すには、他のクラスと同様にインスタンス変数を宣言します。

また『Managed Object Accessor Methods』で説明されている適切なアクセサメソッドを実装する必要があります。

カスタムインスタンス変数を定義した場合、派生した属性値や他の一時的なプロパティを格納するために、これらの変数をdidTurnIntoFaultではなくdeallocでクリーンアップする必要があります。


検証メソッド

NSManagedObjectは検証プロパティと相互プロパティ値のための一貫性のあるフックを提供します。

通常はvalidateValue:forKey:error:をオーバーライドせず、代わりにNSKeyValueCodingプロトコルで定義されている、validate<key>:error:形式のメソッドを実装します。

相互プロパティ値を検証する場合は、validateForUpdate:または関連する検証メソッドをオーバーライドすることができます。

カスタムプロパティの検証メソッド内でvalidateValue:forKey:error:を呼び出さないでください。

実行時にvalidateValue:forKey:error:を呼び出すと無限ループが生成されます。

カスタム検証メソッドを実装する場合、通常は直接呼び出してはいけません。

代わりに、適切なキーを使用してvalidateValue:forKey:error:を呼び出す必要があります。

これは管理オブジェクトモデルで定義された全ての制約に適用されることが保証されます。

(validateForUpdate:などの)カスタム相互プロパティの検証メソッドを実装する場合、最初にスーパークラスの実装を呼び出す必要があります。

これは個々のプロパティについて検証メソッドが呼び出されることを保証します。

1回の処理に複数の検証失敗がある場合、配列でそれらを収集し、NSErrorオブジェクト内のuserInfo辞書に(キーNSDetailedErrorsKeyを使用して)配列を追加して戻る必要があります。

例は『Model Object Validation』を参照してください。



●タスク

管理オブジェクトの初期化

– initWithEntity:insertIntoManagedObjectContext:

管理オブジェクトのIDの取得

– entity
– objectID
– self

状態情報の取得

– managedObjectContext
– isInserted
– isUpdated
– isDeleted
– isFault
– faultingState
– hasFaultForRelationshipNamed:

ライフサイクルと変更イベントの管理

+ contextShouldIgnoreUnmodeledPropertyChanges
– awakeFromFetch
– awakeFromInsert
– awakeFromSnapshotEvents:
– changedValues
– committedValuesForKeys:
– prepareForDeletion
– dealloc
– willSave
– didSave
– willTurnIntoFault
– didTurnIntoFault

サポートしているキー値コーディング

– valueForKey:
– setValue:forKey:
– mutableSetValueForKey:
– primitiveValueForKey:
– setPrimitiveValue:forKey:

検証

– validateValue:forKey:error:
– validateForDelete:
– validateForInsert:
– validateForUpdate:

サポートしているキー値監視

+ automaticallyNotifiesObserversForKey:
– didAccessValueForKey:
– observationInfo
– setObservationInfo:
– willAccessValueForKey:
– didChangeValueForKey:
– didChangeValueForKey:withSetMutation:usingObjects:
– willChangeValueForKey:
– willChangeValueForKey:withSetMutation:usingObjects:



●クラスメソッド



●インスタンスメソッド

・managedObjectContext

- (NSManagedObjectContext *)managedObjectContext

レシーバが登録されている管理オブジェクトコンテキストを返します。

このメソッドは、レシーバがコンテキストから削除されている場合はnilを返します。

レシーバがフォールトの場合、このメソッドを呼び出しても発動しません。


setValue:forKey:

- (void)setValue:(id)value forKey:(NSString *)key

指定された値に、レシーバの指定されたプロパティを設定します。

keyがモデルによって定義されたプロパティではない場合、メソッドは例外を発生させます。

keyが対一の関係で識別される場合、レシーバへの値によって指定されたオブジェクトと関連付けされ、以前に関連付けられていたオブジェクトは解除されます。

指定したコレクションオブジェクトとキーが対多の関係で識別される場合、レシーバにコレクションに格納されているオブジェクトが関連付けられ、以前に関連付けられていたオブジェクトは解除されます。

このメソッドは、レシーバのクラスが明示的にkeyに対するキー値コーディングに準拠したアクセサメソッドを提供しない限り、管理オブジェクトの汎用的な辞書ストレージへのアクセスするNSManagedObjectによってオーバーライドされます。

重要:このメソッドはオーバーライドしないでください。

value:keyで指定されたプロパティの新しい値を指定します。

key:レシーバのプロパティのいずれかの名前を指定します。


valueForKey:

- (id)valueForKey:(NSString *)key

keyで指定されたプロパティの値を返します。

keyがモデルによって定義されたプロパティではない場合、メソッドは例外を発生させます。

このメソッドは、レシーバのクラスが明示的にkeyに対するキー値コーディングに準拠したアクセサメソッドを提供しない限り、管理オブジェクトの汎用的な辞書ストレージへのアクセスするNSManagedObjectによってオーバーライドされます。

重要:このメソッドはオーバーライドしないでください。

key:レシーバのプロパティのいずれかの名前を指定します。



●定数



参考文献

NSManagedObject Class Reference

NSErrorクラス

2011. 04. 17
●概要

NSErrorオブジェクトは、エラーコードやエラー文字列のみを使用した場合より、より価値があり拡張可能なエラー情報をカプセル化します。

NSErrorオブジェクトの中核は(文字列で表される)エラードメインで、ドメイン固有のエラーコードとアプリケーション固有の情報を含むユーザ情報の辞書です。

いくつかのよく知られているドメインは、Mach、POSIX、OSStatusエラーに対応して定義されています。

Foundationのエラーコードは、Cocoaエラードメインに、ドキュメントは『Foundation Constants』を参照してください。

さらにNSErrorは、エラーオブジェクトに任意でユーザ情報の辞書を追加することができ、エラーを人が読める形式の説明として返すような手段を提供します。

NSErrorは抽象クラスではなく、直接使用することができます。

アプリケーションは、localizedDescriptionをオーバーライドすることによって、エラー文字列をより良くローカライズされたエラー文字列を提供する、NSErrorのサブクラスを生成することもできます。

一般的にメソッドは、エラーオブジェクトの単純な存在の有無というより、例えばNOやnilを返すといったエラー状態を通知する必要があります。

メソッドはオプションで、エラーの詳細を適切に、参照によってNSErrorオブジェクトを返すことができます。



●採用されているプロトコル

NSCoding

    encodeWithCoder:
    initWithCoder:

NSCopying

    copyWithZone:



●タスク

●エラーオブジェクトの生成

+ errorWithDomain:code:userInfo:
– initWithDomain:code:userInfo:

●エラープロパティの取得

– code
– domain
– userInfo

●ローカライズされたエラー説明の取得

– localizedDescription
– localizedRecoveryOptions
– localizedRecoverySuggestion
– localizedFailureReason

●エラー修復試行者の取得

– recoveryAttempter

●ヘルプアンカーの表示

– helpAnchor



●クラスメソッド



●インスタンスメソッド

・userInfo

- (NSDictionary *)userInfo

レシーバのユーザ情報の辞書を返します。

戻り値はユーザ情報の辞書、あるいはユーザ情報の辞書が設定されていない場合はnilを返します。



●定数



参考文献

NSError Class Reference

NSManagedObjectContextクラス

2011. 04. 09
●概要

NSManagedObjectContextのインスタンスは、単一の『オブジェクト空間』またはアプリケーション内のスクラッチパッドを表します。

その主な責任は、管理オブジェクトのコレクションの管理です。

これらのオブジェクトは、一つ以上の永続ストアの内部で一貫したビューを表す、関連したモデルオブジェクトのグループを形成します。

単一の管理オブジェクトのインスタンスは、一つのコンテキストに一つだけ存在しますが、オブジェクトの複数のコピーは異なるコンテキストに存在することができます。

したがってオブジェクトをユニークにするには、特定のコンテキストにスコープします。


ライフサイクルの管理

コンテキストは管理オブジェクトのライフサイクルにおいて中心的な役割を果たす強力なオブジェクトで、アンドゥ/リドゥや逆関係処理、ライフサイクル管理から(フォールティングを含む)検証の責任を持ちます。

コンテキストを介して永続ストアからオブジェクトを取得または『フェッチ』することができ、これらのオブジェクトに変更を加え、そしてどちらかを破棄して(再びコンテキストを介して)永続ストアに戻り、変更またはコミットを適用します。

コンテキストはオブジェクトの変更を監視とアンドゥマネージャを保持する責任があり、アンドゥとリドゥをきめ細かく制御することができます。

オブジェクトの新規挿入や削除はフェッチで行うことで永続ストアに変更をコミットすることができます。


永続ストアコーディネータ

コンテキストは常に、データを含む様々な永続ストアへのモデルとディスパッチ要求を提供する、『親』永続ストアコーディネータを持っています。

コーディネータが無ければ、コンテキストは完全に機能しません。

コンテキストのコーディネータは管理オブジェクトモデルを提供し、永続性を処理します。

外部ストアからフェッチされた全てのオブジェクトは、外部ストアに各オブジェクトを一意に識別するために使用するグローバルな識別子(NSManagedObjectIDのインスタンス)と共にコンテキストに登録されます。


通知

コンテキストは様々な時点で通知を投稿します。
(例えばNSManagedObjectContextObjectsDidChangeNotificationなど)

通常、既知のコンテキストからのみこれらの通知を受け取るように登録する必要があります。

[[NSNotificationCenter defaultCenter] addObserver:self

                selector:@selector(<#Selector name#>)

                name:NSManagedObjectContextDidSaveNotification

                object:<#A managed object context#>];

いくつかのシステムフレームワークでは、内部的にCore Dataを使用してください。

(addObserver...メソッドへオブジェクトのパラメータとしてnilを渡すことによって)全てのコンテキストからこれらの通知を受け取ろうと登録する場合、処理が困難な場合は予想外の通知を受け取る可能性があります。


同一性

Core Dataはスレッド(またはシリアライズされたキュー)を使用して、管理オブジェクトと管理オブジェクトコンテキストを保護します。
(『Concurrency with Core Data』を参照)

この結果は、デフォルトのオーナーが割り当てられたスレッドまたはキューであることを仮定しています。
(これはinitメソッドを呼び出したスレッドによって決定されます)

したがって、初期化を行ったスレッドとは異なるスレッドにコンテキストを渡さないでください。

代わりに、受け取るスレッド/キューに新しいコンテキストを生成し、永続ストアコーディネータへの参照を渡す必要があります。

NSOperationを使用する場合は、(一連のキュー用の)メインまたは(共存するキュー用の)スタート内にコンテキストを生成する必要があります。


サブクラス化の注意

NSManagedObjectContextのサブクラス化は強く推奨しません。

変更の追跡とアンドゥの管理メカニズムは高度に最適化されており、故に複雑かつ繊細になっています。

独自に追加されたロジックを介在させると予期せぬ結果を生み出し、processPendingChangesに影響を与える可能性があります。

ストアの移行などの状況では、Core Dataは自身が使用するためにNSManagedObjectContextのインスタンスを生成します。

このような状況下では、カスタマイズしたサブクラスの機能に依存することはありません。

どのNSManagedObjectのサブクラスでも、(NSManagedObjectContextのサブクラスとしてではなく)常にNSManagedObjectContextと完全な互換性がある必要があります。



●タスク

オブジェクトの登録とフェッチ

– executeFetchRequest:error:
– countForFetchRequest:error:
– objectRegisteredForID:
– objectWithID:
– existingObjectWithID:error:
– registeredObjects

管理オブジェクトの管理

– insertObject:
– deleteObject:
– assignObject:toPersistentStore:
– obtainPermanentIDsForObjects:error:
– detectConflictsForObject:
– refreshObject:mergeChanges:
– processPendingChanges
– insertedObjects
– updatedObjects
– deletedObjects

別のコンテキストからの合成変更

– mergeChangesFromContextDidSaveNotification:

アンドゥ管理

– undoManager
– setUndoManager:
– undo
– redo
– reset
– rollback
– save:
– hasChanges

ロック


– lock
– unlock
– tryLock

削除の伝播

– propagatesDeletesAtEndOfEvent
– setPropagatesDeletesAtEndOfEvent:

登録されたオブジェクトの保持

– retainsRegisteredObjects
– setRetainsRegisteredObjects:

永続ストアコーディネータの管理

– persistentStoreCoordinator
– setPersistentStoreCoordinator:

失効間隔の管理

– stalenessInterval
– setStalenessInterval:

マージポリシーの管理

– mergePolicy
– setMergePolicy:



●インスタンスメソッド

executeFetchRequest:error:

- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error

与えたフェッチ要求によって指定された基準を満たす、オブジェクトの配列を返します。

戻り値は、レシーバの永続ストアコーディネータに関連付けされた永続ストアから、レシーバからフェッチされた要求によって指定された基準を満たすオブジェクトです。

エラーが発生した場合はnilを返します。

リクエストで指定された基準に一致するオブジェクトが無かった場合は、空の配列を返します。

返されたオブジェクトは、レシーバに登録されます。

考慮すべき重要な点は以下の通りです。
  • フェッチ要求に述語が無い場合、指定されたエンティティの全てのインスタンスを取得し、以下の基準に従います。

  • (リクエストによって指定されたエンティティのインスタンスで、もしあるならリクエストの述語と一致する)requestによって指定された基準を満たし、コンテキストに挿入されているが永続ストアにまだ保存されていないオブジェクトは、フェッチ要求がコンテキスト上で実行された場合に取得されます。

  • コンテキスト内のオブジェクトが変更されている場合、永続ストア内の現在の状態に対してではなく、述語は変更された状態と比較して評価します。
    したがって、コンテキスト内のオブジェクトがフェッチ要求の基準を満たすように変更されていた場合、リクエストはたとえ変更がストアに保存されていない場合でも、基準を満たしていないストア内の値を取得します。
    逆に、コンテキスト内のオブジェクトがフェッチ要求と一致しないように変更されていた場合、フェッチ要求はストア内のバージョンと一致していても取得しません。

  • オブジェクトがコンテキストから削除されている場合、フェッチ要求はたとえその削除がストアに保存されていなくても、取得しません。
更新の保留や挿入、削除だけでなく、(populated、faults fired、『read from』など)実体化されたオブジェクトは、開発者の介入無しにフェッチ操作によって変更されることはありません。

いくつかのオブジェクトをフェッチする場合は、それらを一緒に処理し、新しいインスタンスの取得または既存のオブジェクトのデータ更新はしないで(現在のインメモリの状態を持つ既存のオブジェクトを取得し)、それからそれらのオブジェクトのスーパーセットを含む新しいフェッチを実行してください。

request:フェッチの検索基準を指定するフェッチ要求を指定します。

error:フェッチを実行して問題があった場合に、問題を説明するNSErrorのインスタンスを含めて返します。


hasChanges

- (BOOL)hasChanges

レシーバの変更がコミットされていないかを示すブール値を返します。

戻り値は、レシーバの変更がコミットされていない場合はYES、そうでない場合はNOを返します。

Mac OS X v10.6以降では、このプロパティはキー値監視に準拠しています。
(『Key-Value Observing Programming Guide』参照)

Mac OS X v10.6より前では、このプロパティはキー値監視に準拠しておらず、例えばCocoaバインディングを使用している場合、管理オブジェクトコンテキストのhasChangeプロパティへバインドすることはできません。

キー値監視(KVO)を使用してこのプロパティを監視する場合、コンテキストに触れないようにするか、または通知のためにobserveValueForKeyPath:ofObject:change:context:の実装でそのオブジェクトを含める必要があります。

(これはKVO通知のロケーションが複雑なためで、例えばコンテキストはアンドゥの操作やマージの競合を修復している途中の可能性があるからです)

hasChangesの値が変化した結果として、その変更された管理オブジェクトのコンテキストへメッセージを送信する場合は、その後でコールスタックをアンワインドする必要があります。
(通常、performSelector:withObject:afterDelay:または類似したメソッドを使用します)


persistentStoreCoordinator

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

レシーバの永続ストアコーディネータを返します。


save:

- (BOOL)save:(NSError **)error

永続ストアへ登録されたオブジェクトへの未保存の変更をコミットしようと試みます。

戻り値は、保存が成功した場合はYES、それ以外はNOを返します。

(例えば、いくつかの編集されたオブジェクトが検証に失敗した場合など)複数のエラーが発生した場合、複数のエラーが示されたNSErrorの記述が返され、userInfo辞書にキーNSDetailedErrorsが含まれます。

NSDetailedErrorsキーに関連付けられた値は、個々のNSErrorオブジェクトを含む配列です。

error:NSErrorオブジェクトへのポインタです。
NSErrorオブジェクトを生成する必要はありません。
NULLを渡した場合、最初の失敗の後に保存処理が中断します。


setPersistentStoreCoordinator:

- (void)setPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)coordinator

レシーバの永続ストアコーディネータを設定します。

コーディネータは管理オブジェクトモデルの提供し、永続性を処理します。

複数のコンテキストがコーディネータを共有できることに注意してください。

coordinatorがnilの場合、このメソッドは例外を発生させます。

永続ストアコーディネータからコンテキストを『切断』する場合、単純にコンテキストへの全ての参照を解放するだけでなく、正常に割り当てを解除する必要があります。

coordinator:レシーバの永続ストアコーディネータ



●定数



●通知



参考文献

NSManagedObjectContext Class Reference






bose_soundlink_revolve
Calendar
03 | 2011/04 | 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

bose_soundlink_revolve
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR