【问题标题】:Store specific interactions with Core Data存储与 Core Data 的特定交互
【发布时间】:2009-08-04 21:19:04
【问题描述】:

我正在阅读有关核心数据的文档以加快搜索速度。我发现了以下内容,并对它的含义感到有些困惑:

另一方面,SQL 存储, 编译谓词并排序 描述符到 SQL 并评估 导致数据库本身。这是 主要是为了 性能——数据库更快 在这(这就是他们设计的 for)——但这意味着评估 发生在非 Cocoa 环境中, 所以排序描述符(或 依赖于 Cocoa 的谓词)不能 工作。支持的排序选择器是 比较:和不区分大小写比较:。 请注意,此外您无法排序 在瞬态属性上使用 SQLite 存储。

the documentation is here

这是否意味着他们建议在从 sqlite 存储中获取托管对象时不要使用谓词或排序描述符?

我目前有一个 FetchRequest,我在其中传递了以下内容:

    NSPredicate *thingSearchPredicate = 
[NSPredicate predicateWithFormat:@"label BEGINSWITH[cd] %@", searchText];
    NSSortDescriptor *sortDescriptor = 
[[NSSortDescriptor alloc] initWithKey:@"label" ascending:YES];

搜索有效,但我认为我使用的谓词依赖于可可。 BEGINSWITH 是我假设一个 compare:options:range: 简写,其中 range 是搜索字符串的长度。变音符号不敏感的事实显然似乎反驳了上面的建议,这是否意味着在获取该实体的所有实例后自动为我评估它们?

还有其他加快搜索速度的方法吗?

【问题讨论】:

  • 不,他们意味着您不能使用 NSSQLiteStore 的谓词或排序描述符......只是 某些 谓词和可能适用于其他存储的排序描述符不适用于 SQLLite 存储。基本上,他们必须能够将它们编译成 SQL 语句。 BEGINSWITH[cd] 可以很容易地用 SQL 表示。

标签: objective-c cocoa sqlite core-data


【解决方案1】:

如果核心数据无法用 SQL 表达您的查询,您将看到一个错误。出于性能原因,文档指定将表达式转换为 SQL 并传递给 sqllite。不是说不能用SQL表达就退化成Cocoa。

它们的意思是肯定有 谓词在 SQL 中不可表达,因此根本不起作用。

此外,您需要使用他们的排序选择器,而您不能自己制作,因为他们不知道如何将 Cocoa 中的任意对象转换为 SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多