CoreData NSDate SQLite精度差异

时间:2011-10-25 01:42:55

标签: sqlite core-data nsdate precision

我已经看到了一些围绕这个主题的问题,但没有什么相当匹配。

我正在创建一个Timestamp作为主键的一部分。时间戳设置为[NSDate date]并存储在SQLite存储中。当我查看商店时,日期具有完全精确度(最多7个小数位表示100纳秒精度)。

我在服务器上运行服务,我需要将数据发送到并从中检索日期。发送过程序列化数据,并发送具有所需精度的日期(存储为SQL Server中的datetime2)我使用:

   NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
   [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'"];
   NSString *stringFromDate = [dateFormat stringFromDate:dateTime];

,反之亦然,从服务器检索日期。

问题是从商店检索的日期出于某种原因仅以毫秒精度。因此,如果我在商店中有一个时间戳为341196557.808558,则检索到NSDate然后使用上面的代码生成一个字符串,读作“2011-10-24'T'08:48:17.8090000”。

这会被发送到服务器,它以毫秒级的精度尽职尽责地存储它(因为这就是它的全部)。然后当我检索日期时,反序列化它并尝试对商店使用谓词提取它不会返回记录,因为日期不相等。做一个<或者>比较不起作用,因为它是主键......我需要==

我不介意在保存之前将时间戳降低到毫秒精度(如果我能弄清楚如何)但对我来说似乎非常奇怪原始日期可以存储并保存微秒精度但不保持相同从商店检索日期时的精确度?

会喜欢这方面的任何想法,或者那个将这个混乱排除在外的宝石单行...

1 个答案:

答案 0 :(得分:3)

虽然我不知道为什么纳秒级精度会被降低(这让我感到惊讶,你应该对它进行雷达)我能说的是:

时间戳是一个可怕的主键。如果你可以改变,我会强烈推荐它。

如果您必须使用时间戳,那么我建议您将-timeIntervalSinceReferenceDate存储在核心数据中,然后在需要将其发送到服务器时重新构建日期。

更新

时间戳是一种痛苦(正如您所经历的)并且从纯粹的DB角度来看是浪费的,因为您从未按顺序使用所有这些。

根据您的尝试,INT64增加(使用Core Data不容易)效果很好。如果您使用的时间戳不仅仅是唯一键的一部分,那么我会将其保留为NSTimeInterval(double),如上所述。这样可以保持精确度并避免弄乱字符串。请记住,字符串可能非常慢。