2012-01-03 10 views
0

コアデータに保存する前に、コンテキストの検証を行うにはどうすればよいですか。私の考えは、値がコアデータに値を保存してはならないという妥当性検査を満たしていない場合、コアデータに保存する前にいくつかの検証が必要であるということです。たとえば、エンティティ候補の名前、クラス、年齢などの属性があります。値をゼロにしないでください。値がnilの場合、他の値は保存されません。コアデータに保存する前にコンテキストの値を検証する方法

誰もがこの点で

を手伝ってくれるEDITED: 私は私が保存してキャッチオール検証をしたい保存、それがコアデータ

答えて

0

で行わなければならない時に、それらをチェックする必要がありますルーチン。コンテキストを保存するために実際に呼び出す前に、そのinsertedObjects配列をループし、必要に応じてそれらを確実に確認してください。そうでない場合は、それらを削除するか、何かを完了する必要があることをユーザーに警告することができます(後者がメソッドから戻り、ユーザーに問題を修正するチャンスを与えます)。

その他の検証は、管理対象オブジェクトに割り当てるテキストフィールドやチェックボックスなどから値を取得するときに、入力時点で行う必要があります。問題がある場合はすぐにユーザーに知らせてください。

フィールドにも適用できるNSNumberFormatterをチェックして、ユーザーが間違ったエントリを作成しないようにします。

+0

例えば、キーとして属性が必要であり、その属性がnilでなければ、コンテキスト内の他の値だけをコアデータに保存する必要があります。そんなことはありますか? @ウィンケ – Vijay

+0

あなたの質問を誤解していました。私は以下の別の答えを掲示しました。 – Wienke

0

Coredataは、値を挿入するときに自身を検証します。 managedObjectクラスでは、coredataが値を保存する前に検証をチェックするようにカスタム検証を記述できます。値が有効でない場合、コンテキスト内の値はコアデータに保存されません。ここで

私は

@interface 
-(BOOL) validateForInsert:(NSError **)error; 

@implementation 
-(BOOL) validateForInsert:(NSError **)error { 
    // check the value of the field with validation 
    if(condition == true) { 
     return Yes; 
    } 
return NO; 
} 

(NSError **)を追加申し訳ありませんが、私はあなたの質問を読んでいなかったデリゲートメソッド

+0

ここにはいくつかの混乱があります:オブジェクトを保存するには、オブジェクトを含むコンテキストを保存することです。オブジェクトがすでにコンテキストに挿入されていない限り、このようなことは起こりません。また、NSErrorはメソッドを呼び出さない。空のNSErrorを参照渡しし、エラーが発生した場合は、このメソッドによって満たされます。 – Wienke

0

ようかのようcoredataは、このメソッドを呼び出すことになり、特殊なパラメータであり、私がその最初の答えをしたときに十分注意深く。個々のattrsの個々のエントリが正しいことを検証するのではなく、すべての attrsがそのオブジェクトに対して満たされていない限り、変更を保存する必要はありません。

Model Object Validation」アップルのドキュメントを見ると

は、あなたが -property検証ではなく、プロパティの検証と懸念している、とあなたは、この目的のために validateForInsert:を使用して考えなければ正しい軌道に乗っています。

この文書にも例が示されています。

- (BOOL)validateForInsert:(NSError **)error { 
if (self.name && self.class && self.age) 
    return [super validateForInsert:error]; 
else 
    return NO; 
} 

ただし、この方法は保存段階ではなく挿入段階で行われます。

新しいエンティティのエントリをまとめて収集する場合は、挿入段階で検証すると意味があります。つまり、そのオブジェクトが不完全として破棄された場合は、新しいオブジェクトをコンテキストに追加しないでください。 既存のオブジェクトへの変更のエントリを収集していて、それらの変更を受け入れる前にそれらの変更がすべて一緒に機能するようにしたい場合は、validateForUpdate:が意味を持ちますが、オブジェクトを元の状態に復元する方法はありません他の場所で元の値をキャッシュしていない限り、保存せずにコンテキストを再オープンする以外の方法があります。 オブジェクトを個別に収集してオブジェクトを保存する前にそれらがすべて完了していることを確認する場合は、まずコンテキストの挿入オブジェクトをループし、コンテキストを実際に保存する前に検証を行います。上書きする既存のvalidateForSave:メソッドはありませんが、追加することはできます。

これらの手法を組み合わせることもできます。エントリを収集して新しいオブジェクトを挿入せずに作成しますが、これらのオブジェクトはすべてアレイにキャッシュします。保存する時間が来たら、キャッシュをループしてオブジェクトがコンテキストに挿入されるのは、validateForInsert:を渡す場合のみです。コンテキストを保存します。

明らかに私はあなたと一緒に学んでいるので、上記はかなりクッキーではないかもしれません。うまくいけば、アップルの医者があなたを始めるのに十分であることを望みます。

+0

新しいリンク:[オブジェクトの検証](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/ObjectValidation.html#//apple_ref/doc/uid/TP40001075-CH20-SW4 )。また、validateForInsert:の最初の2行では、プロパティレベルの検証( '[super validateForInsert:error]')とプロパティ間または整合性の検証(self.name && self.class && self.age)を混同しています。 。最初にプロパティーレベルの検証を行い、次に*一貫性をチェックします。あなたのコードが現れても、名前もクラスも年齢も設定することはできません。 –

関連する問題