2012-02-09 66 views
0

編輯:我添加了一個新的粗糙表模型的評論。這是你想到的嗎?Xcode:使用複雜的謂詞來過濾核心數據集

enter image description here

我還在努力制定出一個核心數據集的搜索過濾器。我卡住here,所以我以不同的方式接近問題。

首先,我想要做的是以下幾點:

  1. 通過迭代所有對象(NSManageObject *在tableViewModel.items對象)

  2. 提取所有爲每個子實體對象「對象「並根據搜索詞進行驗證。

  3. 如果搜索詞並在子實體存在,則添加「對象」到「autoSearchResults」(如果它不存在那裏)

我的代碼如下:

NSLog(@"%s", __FUNCTION__); 

    NSMutableArray *startArray = [NSMutableArray array]; 
    NSMutableArray *filteredArray = [NSMutableArray array]; 

    for (NSManagedObject *object in tableViewModel.items) 
    { 
     NSLog(@"1 "); 

     NSSet *set1 = [object valueForKeyPath:@"people.name"]; 
     NSString *str1 = [[set1 allObjects] componentsJoinedByString:@", "]; 
     peopleSet = str1; 

     NSLog (@"peopleSet is %@ ", peopleSet); 

     NSLog(@"2 "); 
     NSSet *set2 = [object valueForKeyPath:@"place.name"]; 
     NSString *str2 = [[set2 allObjects] componentsJoinedByString:@", "];   
     placeSet = str2; 

     NSLog(@"3 "); 
     NSSet *set3 = [object valueForKeyPath:@"keyword.name"]; 
     NSString *str3 = [[set3 allObjects] componentsJoinedByString:@", "];   
     keywordSet = str3; 

     NSLog(@"4 "); 
     NSSet *set4 = [object valueForKeyPath:@"type.name"]; 
     NSString *str4 = [[set4 allObjects] componentsJoinedByString:@", "];   
     typeSet = str4;  

     NSLog(@"5 "); 
     NSSet *set5 = [object valueForKeyPath:@"symbol.name"]; 
     NSString *str5 = [[set5 allObjects] componentsJoinedByString:@", "];   
     symbolSet = str5; 

     NSLog(@"6 "); 

     NSLog (@"searchText is: %@ ", searchText); 

     myPredicate = [NSPredicate predicateWithFormat:@"(peopleSet contains[cd] %@) || (placeSet contains[cd] %@) || (keywordSet contains[cd] %@) || (typeSet contains[cd] %@) || (symbolSet contains[cd] %@)", searchText, searchText, searchText, searchText, searchText ]; 

     NSLog(@"7 ");  
     if (myPredicate) { 
      [startArray addObject:object]; 
      NSLog (@"startArray.count is %i ", startArray.count); 
     } 

     NSLog(@"8 "); 
     NSLog (@"startArray.count is %i ", startArray.count); 
     /* 
     if (startArray.count == 0) 
     { 
      NSLog(@"0"); 
     } else {    
      NSLog(@"9 "); 
      [filteredArray addObject: startArray]; 
      NSLog(@"10 "); 
      [startArray removeAllObjects]; 
      NSLog(@"11 "); 
     } 
     */ 

    }  


    //autoSearchResults = filteredArray; 
    return autoSearchResults; 
} 

在我的測試中,我有3個對象,一個是person.name「我」,一個是「you」,另一個是「Mother」。所有其他字段在所有對象中都是空白的。

現在,我停下來看看爲每個搜索選擇了多少個對象。基本上,searchText被找到但被忽略。也就是說,例程看到searchText包含「我」,例如,但仍然添加一個對象,其中實際文本是「你」。

我希望得到任何幫助。如果這將有助於減少這個例子中,請讓我知道..

回答

2

有關此代碼的最嚴重錯誤的事情是,你實際上並沒有使用您所創建的謂詞。爲了根據謂詞測試對象,請在謂詞上調用evaluateWithObject:,傳入要測試的對象。

但是這仍然不起作用,因爲它不知道「peopleSet」和所有其他字符串是什麼:您不能像使用keypath一樣使用局部變量。最後,這種結構並沒有真正利用謂詞的力量,你正在使用謂詞像正則表達式。要實際過濾對象集合,請在集合本身上使用諸如filteredSetUsingPredicate:的方法,而不是測試每個對象。

當然,這將要求您在託管對象模型上創建一個瞬態屬性來存儲名稱的連接列表,但如果您正確執行此操作,則在執行此類過濾時會看到性能提升。

+0

呃。謝謝..有什麼我對嗎? :) – 2012-02-09 01:47:08