我想处理来自用户的键盘输入的一些小错误(这是一个概念阶段,所以我还没有任何组件,所以请随意提出一个)。
假设我有CoreData
个实体,有1000个输入。我想只搜索一个属性。我想要像UIFetchedResultController
中的行为(这可能是一个,但我也可以模拟它的行为)。
一旦agin,我们假设这是水果实体包含属性name
并且用户搜索它。他想搜索banana
,但他错误地输入bansna
(或vanana
)。我还想向他展示“香蕉”阶段。
我该怎么做?这可以使用NSPredicate
来完成吗?我可以操纵这种“宽容”吗?
我提前使用1000个条目,我假设的搜索速度取决于此容差和数据库大小。那么为此我可能应该从移动服务转向REST服务?在这里寻求建议。
答案 0 :(得分:4)
核心数据提取请求不支持“容错”搜索。可用 字符串的比较运算符是
==
表示完全相同,CONTAINS
,BEGINSWITH
,ENDSWITH
用于子字符串搜索,LIKE
用于简单的通配符匹配,MATCHES
用于正则表达式搜索。但是对于“容错”搜索,你需要一些先进的比较算法,比如 Levenshtein distance,可用于确定 如果一个字符串“接近”另一个字符串(并且可能有更多算法)。
由于Core Data fetch请求无法使用“基于Objective-C”的谓词
(例如predicateWithBlock
),这意味着你必须获取所有对象和
然后应用容错比较方法。
答案 1 :(得分:1)
将谓词写为:WHERE name like '?anana' or name like 'v?nana' or name like 'va?ana' or name like 'van?na' or name like 'vana?a' or name like 'vanan?'