2009-08-04 35 views
0

我正在阅读有关加速我的搜索的核心数据的文档。我发现下面并略有困惑,这是什么意思:存储与核心数据的特定交互

的SQL存储,而另一方面, 编译谓词和排序 描述符SQL和评估 结果在数据库本身。这是 主要做了 性能数据库是在这个快得多 (这就是它们被设计为 ) - 但它意味着,评价 发生在非可可环境, 等排序描述符(或 谓词)那依靠可可不能 工作。支持的排序选择器是 比较:和caseInsensitiveCompare :. 请注意,此外,您无法使用 SQLite存储对瞬态属性对 进行排序。

the documentation is here

,这是否意味着他们建议从sqlite的商店获取管理对象时,人们不使用谓词或排序描述符?

我现在有一个FetchRequest,我通过如下:

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

搜索工作,但我想我使用依赖于可可的谓词。 BEGINSWITH是我假设一个比较:选项:范围:速记范围是搜索字符串长度。事实上,区分符号不敏感肯定似乎与上述建议相反,所以这只意味着在获取该实体的所有实例后自动评估它们。

有没有其他方法可以加快搜索速度?

+1

不,它们*不表示您不能使用谓词或对NSSQLiteStore进行排序描述符......只是对某些可能适用于其他存储的谓词和排序描述符不适用于SQLLite商店。 基本上,他们必须能够将它们编译成SQL语句。 BEGINSWITH [cd]可以很容易地用SQL表示。 – Hunter 2009-08-04 23:05:17

回答

0

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

它们的含义当然是在SQL中不能表达的谓词,所以根本不起作用。

此外,你需要使用他们的排序选择器,你不能自己创建,因为他们不知道如何在Cocoa to SQL中隐藏任意对象。