我想在很多领域搜索CoreData记录

时间:2013-10-03 19:50:54

标签: ios core-data nspredicate nsfetchrequest

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

我想这样做,因为我希望在我的应用中有一个简单的搜索字段。因此,如果用户键入“Joe Cincinnati”,他们会期望收回所有包含文本“Joe”和“Cincinnati”的记录,无论它们出现在哪个字段中。此外,记录必须同时具有“Joe”和“辛辛那提”在他们的领域的某个地方,无所谓。

2 个答案:

答案 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并迭代属性来创建通用解决方案。您可以检查类型,因为您只关心字符串。对于每个字符串,您应该创建一个谓词。然后,您可以从中创建复合谓词。