1

適切な NSPredicate を作成する際に非常に問題があります。次のモデル構造があります(関連するモデルの一部のみが表示されています) ここに画像の説明を入力

ご覧のとおり、親エンティティから継承された 4 つの AttributeValue エンティティがあります。次に、述語を使用してリクエストを実行する必要があります。

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:managedObjectContext];
[request setIncludesPropertyValues:NO];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY attributeValues.value = %@",@"Certain value"];

[request setPredicate:predicate];
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];

そしてもちろん、このリクエストは例外を引き起こします:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath attributeValues.value not found in entity <NSSQLEntity Entity id=11>'
*** 

基本エンティティには実際には属性がないためvalueです。状況を回避する方法はありますか?エンティティ側からこの方法で正確にデータを入力する必要があります。

4

1 に答える 1

0

タイプ のエンティティを参照していますAttributeValue。このエンティティにはvalueフィールドがありますが、それがどのような型であるか、または何を参照しているかがスキーマから明らかではありません。子エンティティで同じ属性名を意味のあるように繰り返すことはできないと思います。

文字列を参照する場合は、関係を通じてAttributeValueStringエンティティをエンティティに接続する必要があります。Entity親エンティティを「キャッチオール」として使用することはできません。子エンティティは親から属性を継承しますが、関係の代わりには使用されません。(モデルのスキーマ ビューのきれいな矢印のために混乱するかもしれません ;-)。

したがって、あなたの場合、Entityすべての値の種類を表すために、エンティティから 4 つの異なる関係が必要になります。

別の設定を提案させてください。私見ですが、適切な属性をクラス自体に追加AttributeValueし、子エンティティを廃止する方がより現実的です。未使用のものはいつでも空のままにしておくことができます。type必要に応じて、タイプを示すプロパティ (ある種の列挙型) を追加することもできます。

AttributeValue
|_____ stringValue
|_____ integerValue
|_____ doubleValue
|_____ binaryValue
|_____ type

これは、はるかに堅牢で管理しやすいセットアップのようです。

述語では、クエリ対象のデータ型を明示的に指定する必要があります。これは、優れたプログラミングの実践という観点からも理にかなっているようです。

于 2013-03-29T12:54:58.757 に答える