2012-02-09 146 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