【问题标题】:Core Data wants my predicate argument to be an NSNumber and an NSDateCore Data 希望我的谓词参数是 NSNumber 和 NSDate
【发布时间】:2013-04-10 23:20:47
【问题描述】:

我有一个包含多个 UpcomingDates 的事件模型,每个事件都有一个 (NS)Date 类型的属性日期。我正在构建一个获取请求以仅检索在两个给定日期之间具有即将到来的日期的事件。问题是,无论我如何格式化谓词中的输入日期,我都会遇到异常。似乎 Core Data 希望我的谓词参数同时是 NSDates 和 NSNumbers。

当我通过 @([date timeIntervalSinceReferenceDate]) 传入 NSNumbers 时,我看到了:

predicate: 0 != SUBQUERY(upcomingDates, $upcomingDate, $upcomingDate.date >= 387270000 AND $upcomingDate.date <= 387356400).@count
-[__NSCFNumber timeIntervalSinceReferenceDate]: unrecognized selector sent to instance 0x865a0b0

当我走直观的路线时,使用普通的旧 NSDates,我看到了:

predicate: 0 != SUBQUERY(upcomingDates, $upcomingDate, $upcomingDate.date >= CAST(387270000.000000, "NSDate") AND $upcomingDate.date <= CAST(387356400.000000, "NSDate")).@count
-[__NSDate objCType]: unrecognized selector sent to instance 0x86c6450

打印出接收无法识别选择器的对象,它始终是谓词参数中的第一个。

我已经尽我所能验证了comingingDate.date 实际上是一个NSDate(这是模型指定的,但我也查看了它们创建时传入的内容)。我已经尝试使用 CAST 到 NSDates 和 NSNumbers 的每一个排列。我已将谓词分解为最简单的情况,这实际上只是意味着删除一个 AND 子查询谓词。我被难住了。

预计到达时间: 谓词如下。 NSNumbers:

[NSPredicate predicateWithFormat:@"0 != (SUBQUERY(upcomingDates, $upcomingDate, ($upcomingDate.date >= %@) AND ($upcomingDate.date <= %@))).@count", @([self.timeFilterRange[0] timeIntervalSinceReferenceDate]), @([self.timeFilterRange[1] timeIntervalSinceReferenceDate])]

NSD 日期:

[NSPredicate predicateWithFormat:@"0 != (SUBQUERY(upcomingDates, $upcomingDate, ($upcomingDate.date >= %@) AND ($upcomingDate.date <= %@))).@count", self.timeFilterRange[0] , self.timeFilterRange[1] ]

【问题讨论】:

  • 有什么方法可以给我们(混淆版本的)谓词?
  • 当然,它们几乎是您所期望的。已添加到帖子中。
  • 你能保证timeFilterRange中的对象类型吗?
  • 是的,我自己制作。 (lldb) po self.timeFilterRange[0] $1 = 0x08603950 2013-04-10 07:00:00 +0000 (lldb) po [self.timeFilterRange[0] 类] $2 = 0x0248accc __NSDate
  • 我无法重现该问题。 NSDate 版本对我来说没有问题,完全符合您的 SUBQUERY。

标签: ios core-data subquery nsdate predicate


【解决方案1】:

奇怪的是,子查询似乎是问题所在。当我使用这个新谓词时,我可能会或可能不会得到正确的结果(我的设置使得现在很难测试),但我至少没有遇到崩溃。

NSArray *times = @[@([self.timeFilterRange[0] timeIntervalSinceReferenceDate]),
                       @([self.timeFilterRange[1] timeIntervalSinceReferenceDate])];
[NSPredicate predicateWithFormat:@"ANY upcomingDates.date BETWEEN %@", times]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多