NSPredicate在NSDate日期范围内获取日期属性的Core Data对象

时间:2011-03-11 23:23:24

标签: core-data nsdate nspredicate

我正在使用带有几个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

以下是核心数据中的日期(属性类型设置为日期):

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

fromDatetoDate都是NSDate个对象。我已经尝试用distantPastdistantFuture代替这些来完全确定我的核心数据startTime属性是否在日期范围内,我仍然获得0个对象。

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

2 个答案:

答案 0 :(得分:2)

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

-com.apple.CoreData.SQLDebug 1

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

您显然希望在发送应用之前将其删除:)

答案 1 :(得分:0)

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

SELECT DISTINCT typeof(ZSTARTTIME) FROM ZMATCH;

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

在我的谓词中添加'+ 0',以便将startTime属性评估为整数来解决问题。然而,这似乎是一个讨厌的解决方案。同时将日期保存为blob很可能会导致问题进一步发展。所以我回过头来从头开始重新填充SQLite数据库,确保TIMESTAMPs是作为整数而不是字符串插入的。现在一切正常。

然而,这确实意味着我将不得不在下一个应用程序更新中做更多工作,因为我必须确保更新使用新数据库覆盖Documents文件夹中的旧SQLite数据库。有一个简单的方法来做到这一点?我应该看一下Core Data store的迁移吗?