使用复杂条件获取数据

时间:2013-07-01 12:55:23

标签: ios core-data nspredicate

我的应用程序具有相对简单的模型(继承自现有网站的模型)。

该模型的一个属性是date。不幸的是,此属性的值是完全自由格式且类型为String。我的意思是,价值观如下:

  • “1888年6月,阿尔勒”
  • “c.1530”
  • “1634年至1637年”
  • “1508”

有没有办法构建一个谓词,允许我将这些值转换为整数值,以便我可以搜索date属性的值?

目前我使用简单的方法:

NSString *format = @"date contains[cd] %i";
NSPredicate *predicate = [NSPredicate predicateWithFormat:format, year];

但它不允许我在两个给定日期之间找到所有内容。

2 个答案:

答案 0 :(得分:1)

将NSPredicate与正则表达式结合使用。这是一个链接。使用正则表达式搜索4位数字 NSPredicate and Regex

答案 1 :(得分:1)

你......这里可能有问题。任何日期都可以转换为整数值,如果你知道使用什么格式,NSDateFormatter可以很好地解析日期。您似乎有多种不同的格式,因此您无法通过简单的转换或搜索来获取日期字符串的整数值。

找到一个四位数的年份会很容易,但你的“1634-37”的例子会让这个想法受到打击。如果你的搜索是1636,它应该匹配,但没有一些额外的帮助它不会。如果你可以接受一定的误差范围,你可能不在乎 - 只需称之为1634并完成它。如果没有,首先你需要一系列日期(最小1634,最大1637)而不是一个日期,其次,你需要一些方法来认识到“-37”应该适用于“16” 。祝你好运,因为这很快成为一个复杂的问题。

如果只有几种可能的日期格式,您可以为每个格式提供一个解析器,然后使用正则表达式匹配或反复试验来为字符串选择解析器。如果格式有很多,那你就有点搞砸了。您最好手动编辑数据,以您的应用可以理解的首选格式输入日期。最终,这实际上取决于您需要使用数据的准确程度以及您可以在结果中容忍的错误。

在一个稍微单独的注释上,如果是我,我想在从Web服务器接收数据时将这些转换为数值。然后在进行提取时,我将能够在谓词中使用数字匹配来获得快速结果。匹配字符串 - 特别是如果你需要使用正则表达式 - 与数字比较相比非常慢。