我想执行NSFetchRequest。我想查看具有特定NSEntityDescription的所有对象,但只需在所有中查找该实体中的字段中的文本。
我想这样做,因为我希望在我的应用中有一个简单的搜索字段。因此,如果用户键入“Joe Cincinnati”,他们会期望收回所有包含文本“Joe”和“Cincinnati”的记录,无论它们出现在哪个字段中。此外,记录必须同时具有“Joe”和“辛辛那提”在他们的领域的某个地方,无所谓。
答案 0 :(得分:1)
如果没有专门针对此类搜索进行设计,您将无法使用复杂的多部分谓词或使用重复提取来覆盖每个搜索词/字符串属性对。对于M
个搜索字词和N
字符串属性,您最终会得到一个带有M x N
个组件的谓词或执行M x N
个单独的提取。这两个选项都很糟糕。
但是通过一些先进的工作,你可以回避这个问题。以下是一些需要考虑的选项:
向您的实体添加新的“searchText”字段
为名为searchText
的实体描述添加新的字符串属性。该字段由来自每个其他字符串属性的所有文本组成,但是在单个位置中以标准化形式(例如小写)组成。每当另一个字符串字段中的数据发生更改时,您都会更新searchText
。搜索时,您只使用此属性。您的谓词具有与搜索项数量相同的组件数,这应该快得多。
在这种情况下,您的谓词将是复合AND谓词,其中每个术语的格式类似于@"searchText contains %@"
。
或者...
添加新的“SearchText”实体
创建一个名为SearchText
的新实体类型,它具有单个字符串属性。设置从当前实体类型到新SearchText
类型的一对多关系。实体类型的每个实例都与每个可能的搜索项的一个SearchText
实例相关。这仍然需要一个多部分谓词,但由于文本字段要短得多,结果应该快得多。
在这种情况下,你仍然有一个复合AND谓词,尽管在这种情况下每个部分的格式都是@"any searchStrings = %@"
(假设新的多对多关系被称为searchStrings
)。
答案 1 :(得分:0)
您所描述的内容将是一个相当广泛的谓词,但您可以通过检查NSEntityDescription
并迭代属性来创建通用解决方案。您可以检查类型,因为您只关心字符串。对于每个字符串,您应该创建一个谓词。然后,您可以从中创建复合谓词。