搜索不同对象的数组

时间:2015-04-16 09:31:14

标签: ios objective-c arrays search predicate

我在这里挣扎着我的谓词搜索,可能是缺乏词汇量。

我有一种(有点)弱设计,我的截止日期不允许我改变太深,情况如下。

我在contactsusers的桌面视图中搜索我的两个关注对象。当只有联系人时(没有列出的对象是用户),搜索工作正常。

现在,如果它发生(很多时候会发生)这些联系人中的一些是用户,当我搜索tableview时,我的谓词键不匹配,我显然会得到例外。

我怎么能继续解决这个问题,知道我希望搜索仍然包括每个人。 (我有一个备份计划,我只是从搜索功能中删除用户,它就像一个魅力)。

我尝试在我的谓词中使用OR,如下所示:

@"compositeName contains[c] %@ OR name contains[c] %@"   //(where %@ is my search string)

但是我的联系人没有" compositeName"这是不够的。我的用户有一个"名称",这会导致异常。

我不想将用户的密钥名称修改为" compositeName"因为它意味着为我的所有beta测试人员重新安装应用程序,这是(由于截止日期和应用程序生成的内容)也是不可能的。除非他们有办法让他们拥有新的数据模型而不必重新安装,否则我会这样做,只需将它们全部称为" compositeName"。 (或"名称")。

我使用核心数据,数组中充满了NSManagedObject(用户和联系人类型)。

有什么想法吗?

编辑1:这是个好主意吗?

如果有用户,我会考虑拆分数组,然后在两者中使用不同的谓词,然后最后再次组合它们并显示这些结果。但它似乎需要大量处理,也许有更高效的东西?

编辑2:崩溃日志

***由于未捕获的异常终止应用程序' NSUnknownKeyException',原因:' [valueForUndefinedKey:]:实体用户不是密钥值编码兼容的密钥" compositeName& #34;'

编辑3:班级检查

根据评论和堆栈上的其他帖子,您实际上可以添加条件检查,并且还可以在谓词中进行类检查。现在我试着通过写下这两个结合起来:

@"((className == %@) name contains[c] %@) OR ((className == %@) compositeName contains[c] %@)", @"User",searchText, @"Contact", searchText

这不是正确的格式。这是我第一次玩谓词,所以如果你有任何线索如何写一个谓词

(If class = User, then name contains [c], if class = Contact, then compositeName contains [c])

1 个答案:

答案 0 :(得分:2)

您的问题是,您的组合谓词将为每个对象发送valueForKey两个属性 - 并且给定对象仅支持两个属性中的一个,因此您将获得异常。

如果使用AND与名称/ compositeName测试组合对象类测试,则可以避免此问题 - 通过首先测试类,谓词将跳过第二个测试(对于name / compositeName),因为第一个测试已经返回false - 使得无意义地检查AND的第二个子句。

您可以使用类似

的谓词
@"(className == %@ AND name contains[c] %@) OR (className == %@ AND compositeName contains[c] %@)",[User className],searchString,[Contact classname],searchString
相关问题