【问题标题】:Searching in an entire entity, Core Data在整个实体中搜索,核心数据
【发布时间】:2013-09-24 07:11:38
【问题描述】:

在我的核心数据模型中,我想搜索一个与其他实体具有一对一关系并具有所有 10 个属性的实体。如果关键字出现在实体中的任何位置(甚至在子实体中),我应该能够打印相同的实体。

使用枚举块,对我来说不是一个好的选择。

我应该如何在不影响性能的情况下进行搜索?

【问题讨论】:

    标签: ios core-data sqlite nspredicate


    【解决方案1】:

    尝试使用NSPredicate,您可以在NSFetchRequest中写入关键字和实体名称

    【讨论】:

    • 好吧,就是这样,但是记录超过 100 条,每条记录有 10 个实体,数据量很大,因此需要更注重性能的方法
    • 不用担心性能问题,100 条记录是相当合理的(如果不是很少的话)数据量,即使对于 NSArray 也是如此。 CoreData+Sqlite 肯定能负担得起这么大的数据量。您是否尝试在执行 fetch 时测量性能?
    • @Piyush NSPredicate/NSFetchRequest 确实是 API 为此类问题提供的。实现这一点,如果性能不可接受,则返回并启动一个新线程。
    【解决方案2】:

    实际上,如果您使用快速枚举返回,并像这样使用 rangeOfString:

    NSString * lowerCaseTerm  = [term lowercaseString];    
    NSString * content = [(NSString*)[theEntity valueForKey:"key"] lowercaseString];
    
    BOOL containsWord = [content rangeOfString:lowerCaseTerm].location == NSNotFound ? false : true;
    

    其中“content”是您在实体中寻找的“NSString”,您将获得比 NSPredicate 更好的性能。谓词更优雅(代码少得多),但比 rangeOfString 慢得多。(需要一些设置)

    如果你想查看一个实体的多个键,那么设置一个快速数组并循环遍历它。 @[@"key1",@"key2"];

    我使用这种方法不仅可以查找实体是否包含单词,还可以确定相关性。 使用 NSPredicate 搜索 2000 多个实体并过滤掉不需要的实体需要 7 秒,然后再求助。

    使用 rangeOfString 时,一切都需要大约 0.25 秒。辅助线程上 0.5 秒。 (针对我的具体案例的仪器报告。为了让客户满意,我需要提供加权相关性来订购。)

    (提示:在内容中找到单词就是挂断的地方)

    当然,您会希望使用辅助线程来防止您的 UI 在执行此操作时锁定。如果需要更清楚,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多