最大長の値が40のCoreDataエンティティに文字列属性があります。この値をコードで使用したいので、値「40」を再入力する必要はありません。これは可能ですか?
2 に答える
上記のコメントで @K.Steff が述べているように、コードで検証し、コア データ モデルで最大長を設定しない方がよいでしょう。そのコメントに追加するために、このエンティティ タイプにカスタム NSManagedObject サブクラスを使用し、そのサブクラス内でvalidateValue:forKey:error:
このプロパティのキー固有の検証メソッドをオーバーライドまたは実装することを検討することもお勧めします。
このアプローチの価値は、検証時に文字列を切り捨てることによって検証を「強制」するなどのことができることです。NSManagedObject ドキュメントから:
このメソッドは、値をオブジェクトに適した型に変換することと、オブジェクトの規則に従って値を検証することの 2 つを担当します。
NSManagedObject によって提供されるデフォルトの実装は、オブジェクトのエンティティの説明を参照して、値を強制し、許可されていない場合の null 値や、属性にフィールド幅が指定されている場合の文字列の長さなどの基本的なエラーをチェックします。次に、validate< Key >:error: という形式のメソッドを検索し、存在する場合はそれを呼び出します。
validate< Key >:error: の形式のメソッドを実装して、プロパティの説明で使用可能な制約を使用して実行できない検証を実行できます。許容できない値が見つかった場合、検証メソッドは NO を返し、エラーの場合は問題を説明する NSError オブジェクトを返す必要があります。詳細については、「モデル オブジェクトの検証」を参照してください。プロパティ間の検証 (無効な値の組み合わせを確認するため) については、validateForUpdate: および関連するメソッドを参照してください。
したがって、このメソッドを実装して、文字列が長すぎないことを検証し、必要に応じて長すぎる場合は切り捨てることができます。
からviaNSManagedObject
にアクセスできます。そこで、配列と辞書を取得できます。どちらからでもs にアクセスできます。各プロパティの説明には、の配列を返すプロパティがあります。それらの 1 つは、文字列の長さが最大 40 でなければならないという条件です。NSEntityDescription
entity
properties
propertiesByName
NSPropertyDescription
validationPredicates
NSPredicate
悲しいことに、述語をリバース エンジニアリングするのは非常に面倒です。ブロックを提供することで述語を作成できることを考えると、リバース エンジニアリングを行うことは不可能ですらあります。うまくいけば、NSComparisonPredicate
または から木を下って歩いて、 または にたどり着くことができNSCompoundPredicate
ますNSExpression
。
比較述語から、左右の式から、一方が文字列の長さで、もう一方が定数値であることがわかります。
つまり、要約すると:
- Core Data は、述語の非常に一般的な手段を介してのみ検証基準を公開します。
NSExpression
必ずというわけではありませんが、通常は、述語から(意味ではなく自然言語の意味で) 式を再構築できます。と- どこかで長さの比較を探しているだけであることが明確にわかっている場合は、長さを含む比較述語のツリーウォークにさらに単純化できます。
具体的なものと一般的なもののミスマッチがあるため、きれいにならないことは間違いありませんが、可能です。