0

我想执行 NSFetchRequest。我想查看具有特定 NSEntityDescription 的所有对象,但只需在该实体的所有字段中查找文本。

我想这样做,因为我想在我的应用程序中有一个简单的搜索字段。因此,如果用户输入“Joe Cincinnati”,他们会期望返回所有包含文本“Joe”和“Cincinnati”的记录,无论他们出现在哪个字段中。此外,记录必须同时包含“Joe”和“辛辛那提”在他们的领域某处,只是在哪里并不重要。

4

2 回答 2

1

如果没有专门针对这种搜索进行设计,您就会陷入使用复杂的多部分谓词或重复获取以覆盖每个搜索词/字符串属性对的困境。对于M搜索词和N字符串属性,您最终会得到一个带有M x N组件的谓词或进行M x N单独的提取。这两种选择都很糟糕。

但是通过一些预先的工作,您可以回避这个问题。这里有几个可供考虑的选项:

向您的实体添加一个新的“searchText”字段

将一个新的字符串属性添加到您的实体描述中,名为searchText. 该字段由来自每个其他字符串属性的所有文本组成,但在单个位置以标准化形式(例如小写)。每当另一个字符串字段中的数据发生更改时,您都会更新searchText. 搜索时,您只使用此属性。您的谓词与搜索词的数量具有相同数量的组件,这应该会更快。

在这种情况下,您的谓词将是复合 AND 谓词,其中每个术语的格式类似于@"searchText contains %@".

或者...

添加一个新的“SearchText”实体

创建一个名为 的新实体类型SearchText,它有一个字符串属性。设置从当前实体类型到新类型的一对多关系SearchText。您的实体类型的每个实例都将与SearchText每个可能的搜索词的一个实例相关。这仍然需要一个多部分谓词,但由于文本字段要短得多,结果应该会快得多。

在这种情况下,您仍然有一个复合 AND 谓词,尽管在这种情况下,每个部分的格式都类似于@"any searchStrings = %@"(假设新的对多关系称为searchStrings)。

于 2013-10-03T21:40:46.943 回答
0

您所描述的将是一个相当广泛的谓词,但您可以通过检查NSEntityDescription和迭代属性来创建通用解决方案。您可以检查类型,因为您只关心字符串。对于每个字符串,您应该创建一个谓词。然后,您可以从它们创建复合谓词。

于 2013-10-03T20:39:18.127 回答