xCode / iOS - 需要帮助使核心数据搜索谓词工作

Posted

技术标签:

【中文标题】xCode / iOS - 需要帮助使核心数据搜索谓词工作【英文标题】:xCode / iOS - Help needed making a core data search predicate work 【发布时间】:2012-02-06 15:16:20 【问题描述】:

我已经解决这个问题很长时间了,我错过了整个足球赛季,也没有看到我心爱的红人队再次输掉几乎所有的比赛。没有我的支持,即使是我心爱的阿森纳也表现不佳,所以请帮助:

我正在遍历一系列核心数据对象。我正在尝试查找主实体和子实体包含搜索词的对象。如果有,我想将它们添加到结果数组中。

现在有数百行垃圾代码被浪费了,并且永远不会被使用,因为我遵循了不同的线程并采取了错误的线索..

目前的代码是这样的:

NSLog(@"%s", __FUNCTION__);

NSMutableArray *tempArray = [NSMutableArray array];

for (NSManagedObject *object in tableViewModel.items) 
    //myPredicate = [NSPredicate predicateWithFormat:@"(people.name contains[cd] %@)", searchText];
    //another one for the junk heap

    NSLog(@"searchText: %@", searchText); //this is ok
    NSLog(@"\n\nobject is: %@\n\n", object); //this is ok

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(people.name contains[cd] %@)", searchText];

    BOOL ok = [predicate evaluateWithObject:object]; // this is not ok
    if (ok) 
        NSLog (@"result is TRUE");
        [tempArray addObject:object];
        NSLog(@"\n\ntempArray: %@\n\n", tempArray);
     else 
        NSLog (@"result is FALSE");
    


NSLog(@"out of records");
autoSearchResults = tempArray;
NSLog(@"\n\nautoSearchResults: %@\n\n", autoSearchResults);

return autoSearchResults; // return my own search array

我得到的输出如下:

object is: <MainEntity: 0x79c51cb0> (entity: MainEntity; id: 0x79c50880 <x-coredata://99B12EAD-002C-402C-99CA-CF5A328E67E5/MainEntity/p2> ; data: 
    audioName = 00010206120609;
    audioNo = 0;
    date = "2012-02-06 11:10:00 +0000";
    Main = "Main-0001 12.02.06";
    interpret = nil;
    keyword = "<relationship fault: 0x79c708a0 'keyword'>";
    order = 0;
    people = "<relationship fault: 0x79c708c0 'people'>";
    place = "<relationship fault: 0x79c710b0 'place'>";
    recurring = 0;
    summary = Test1;
    symbol = "<relationship fault: 0x79c71110 'symbol'>";
    type = "<relationship fault: 0x79c71170 'type'>";
)

2012-02-06 10:00:11.454 Appkeeper[42598:16c03] result is FALSE

不知道是否需要使用谓词,谓词是否正确。我认为我没有正确测试条件。

所以任何帮助将不胜感激..

编辑 - 添加一点关系模型......

【问题讨论】:

【参考方案1】:

这应该有效:

for (NSManagedObject *object in tableViewModel.items) 
   for (NSManagedObject *person in object.people) 
      if (person.name && 
          [person.name rangeOfString:searchTerm 
                             options:NSCaseInsensitiveSearch]) 
         NSLog(@"%@ contains %@.", person.name, searchTerm);
      
      else 
         NSLog(@"%@ does not contain %@.", person.name, searchTerm);
      
   

【讨论】:

谢谢 Mundi.. 不高兴.. 我无法让“object.people”解决:“在 NSManagedObject 类型的对象上找不到财产人”.. 但我可以获取一个字符串值(str1),所以如果我可以使用某种比较,比如“str1 包含 searchTerm”,那就太好了。 太棒了。您的错误消息准确地解释了问题所在。您的数据模型设置不正确。检查您的 xcdatamodeld 并确保您的主要实体和要检查其属性 name 值的其他实体之间存在名为 people 的一对多关系。 我愿意..我会将关系表添加到我原来的问题中...非常感谢您的帮助.. 好的。您需要将 NSManagedObject 转换为您的实体所在的任何类。例如。在第二个 for 循环中:for (PeopleEntity *person in object.people),假设您也相应地转换了object 一些进展 :)... 我现在可以找到只有一个名称的对象。如果有两个或更多,搜索将找不到它们。有任何想法吗?再次感谢!

以上是关于xCode / iOS - 需要帮助使核心数据搜索谓词工作的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Xcode:将 Web 服务提要保存到核心数据中

iOS 核心数据应用程序委托?

需要一些帮助来构建 asp.net 核心 webapi 中的 [HttpPost] 部分

IOS/xcode:将核心数据从应用委托移动到模型类

xcode核心数据类中的数据类型不匹配

iOS9 Xcode 7 - 核心数据 - 避免重复对象