2012-02-13 9 views
8

(NSXMLParserの一部として)変数を使用して述語に基づいてオブジェクトを取得しようとするメソッドを作成しようとしています。コードは次のようになります。コアデータ述語の要素名に変数を使用する

は、私はクラスで定義されたこれらの変数を持っている:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

@property (strong, nonatomic) NSString *model; 
@property (strong, nonatomic) NSString *element; 

は今の方法で、私はこのような要求に設定:今

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:self.model inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

挑戦を - 私はが行うことができるようにしたいは次のとおりです。

// DOES NOT WORK 
[request setPredicate:[NSPredicate predicateWithFormat:@"%@ == %@", self.element,string]]; 

B utは結果を返しません。

if ([self.element isEqualToString:@"name"]) { 
    [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", string]]; 
} 

これは私のself.elementが正しく設定されている(?と思う)が、述語式の左辺を好きではないと言われます:いくつかの周りいじくる後、私はこの作業を行うことに気付きます変数である。

私も試してみました:

[request setPredicate:[NSPredicate predicateWithFormat:@"%s == %@", [self.element UTF8String],string]]; 

...おそらくそれは、文字列を好ん場合だけ見るために。私はその仕事をすることもできませんでした。

私が試みていることは可能ですか?私はコアデータのドキュメントのできるだけ多くを読んできましたが、このようなサンプルコードを見つけることはできませんが、それが不可能であったとは言いませんでした。

EDIT: となりました作業コードは:あなたが前に行っていない場合は

[request setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", self.element,string]]; 

答えて

14

Predicate Programming Guide読んで、あなたは述語についてのすべてを見つけることができます。

正しく理解していれば、2つの文字列の間に述語を作成したいが、最初の文字列は定義された文字列ではなく変更することができる。
私はこれまで使用していませんが、動的プロパティ名を持つ述語を使用して問題を解決できると思います。ドキュメントからここ

ダイナミックプロパティ名
彼らは %@を使用してフォーマット文字列に置換されている場合、文字列変数が 引用符で囲まれているので、次のように指定する%@を使用することはできません動的プロパティ名: (次の例を参照)。

NSString *attributeName = @"firstName"; 
NSString *attributeValue = @"Adam"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue]; 

この場合の述語フォーマット文字列は、 "Adam"のように "firstName"と評価されます。

動的プロパティ名を指定する場合は、 フォーマット文字列に%Kを使用します(次の図を参照)。

predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue]; 

この場合、述語形式文字列(firstNameの周りに 引用符が存在しないことに注意してください)「アダム」などのfirstNameと評価。

さらに詳しい情報はPredicate Format String Summaryにあります。

+0

これは完璧です、ありがとうございます。私のコードを動作させる情報の特定の部分は、引数を値ではなくキーとして扱う%K変数です。今働いている=) – valdarin

+0

あなたは大歓迎です:)コアデータと述語はすばらしい技術であり、あなたはそれらですべてを行うことができます... – matteodv

関連する問題