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
fromDate
和 toDate
都是 NSDate
对象。我已经尝试用distantPast
和distantFuture
替换它们,以完全确保我的核心数据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 日期范围内的日期属性的核心数据对象的主要内容,如果未能解决你的问题,请参考以下文章