NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象

Posted

技术标签:

【中文标题】NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象【英文标题】:NSPredicate fetch Core Data objects with dates attribute within NSDate date range 【发布时间】:2011-03-11 23:23:24 【问题描述】:

我使用NSPredicate 和几个<= 构造从Core Data 存储中获取对象,在2 个日期之间具有startDate 属性,但我获取了0 个对象。

这是我的 NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"( ( %@ <= %K ) && ( %K <= %@ ) )", fromDate, @"startTime", @"startTime", toDate];

这是控制台输出:

predicate: CAST(336261600.000000, "NSDate") <= startTime AND startTime <= CAST(339285599.000000, "NSDate")
[sectionInfo numberOfObjects]: 0

以下是 Core Data 中的日期(属性类型设置为日期):

startTime
---------
337249800
337309200
337318200

fromDatetoDate 都是 NSDate 对象。我已经尝试用distantPastdistantFuture 替换它们,以完全确保我的核心数据startTime 属性在日期范围内,并且我仍然获取了0 个对象。

我不知道为什么返回 0 个对象。谁能看出我哪里出错了?

【问题讨论】:

【参考方案1】:

我将首先添加以下可执行参数:

-com.apple.CoreData.SQLDebug 1

当您运行您的应用程序时,这将向控制台发送数以亿计的调试信息,但它还应该包含有关它试图转换为 SQL 的谓词的信息,甚至可能包括它为什么不工作的信息。

您显然希望在发布您的应用程序之前将其删除 :)

【讨论】:

谢谢戴夫,这帮助我解决了这个问题(见我的回答):-) @MattVick:很高兴你知道了。我们表示感谢的方式是对您认为有帮助的问题的答案进行投票。【参考方案2】:

查看生成的 SQL 查询后,似乎 TIMESTAMP 被评估为字符串而不是整数。这解释了为什么我的谓词不起作用。我通过在用于预填充核心数据的 SQLite 数据库上运行以下 SQL 查询来确认这一点。

SELECT DISTINCT typeof(ZSTARTTIME) FROM ZMATCH;

这表明 TIMESTAMP 字段是 BLOB 类型的!

将“+0”添加到我的谓词中,以便将 startTime 属性评估为整数,从而解决了该问题。然而,这似乎是一个令人讨厌的解决方案。此外,将日期存储为 blob 很可能会导致进一步的问题。因此,我返回并从头开始重新填充 SQLite 数据库,确保 TIMESTAMP 作为整数而不是字符串插入。现在一切正常。

但是,这确实意味着我将不得不对下一次应用程序更新做更多的工作,因为我必须确保更新用新数据库覆盖 Documents 文件夹中的旧 SQLite 数据库。有没有简单的方法可以做到这一点?我应该看看 Core Data 存储迁移吗?

【讨论】:

以上是关于NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象的主要内容,如果未能解决你的问题,请参考以下文章

带有 groupBy 的 nspredicate 不喜欢带有 nsdate 的谓词比较

无法在 NSDate 中获取当天的开始时间 [关闭]

使用 NSPredicate 比较核心数据查询中的日期

如何在 Swift 中从 NSDate 获取日、月和小时

NSPredicate 用于集合中的最新项目

如何在 [NSDate 日期] 当天 00:00 获取 NSDate?