2012-02-13 17 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]]; 

乙不會返回任何結果。一些碴左右後,我注意到,這確實工作:

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

這告訴我,我的self.element設置正確(我認爲),但謂語不喜歡錶達的左手邊是一個變量。

我也試過:

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

...只是爲了看看也許最好的字符串。我也無法做到這一點。

我試圖甚至有可能嗎?我已經儘可能多地閱讀了Core Data文檔,並且找不到任何示例代碼這樣做,但我也沒有找到任何說這是不可能的。

編輯: 現在的工作代碼:

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

回答

14

如果你還沒有做之前,請閱讀Predicate Programming Guide,你可以找到有關謂詞的一切。

現在,如果我理解正確,你想創建一個兩個字符串之間的謂詞,但第一個不是定義的字符串,但它可以改變。
我以前沒有使用它們,但我相信你可以通過使用動態屬性名稱的謂詞來解決問題。

這裏從文檔:

動態屬性名稱
因爲字符串變量是由 引號時,他們代入使用 %@格式字符串,則不能使用%@指定動態屬性名稱 - 如以下示例中所示的 。

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

在這種情況下,謂詞格式字符串評估爲「firstName」,如「Adam」。

如果要指定動態屬性名稱,請在 格式字符串中使用%K,如以下片段所示。

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

在這種情況下,謂詞格式字符串的計算結果爲姓,如「亞當」(注意身邊有沒有的firstName 引號)。

更多信息可以在這裏找到:Predicate Format String Summary

+0

這是完美的,謝謝。使我的代碼工作的特定信息是%K變量,它將參數視爲鍵而不是值。現在工作=) – valdarin 2012-02-13 15:50:52

+0

歡迎:)核心數據和謂詞是很棒的技術,你可以用它們做所有事情...... – matteodv 2012-02-13 15:55:39