【问题标题】:CoreData NSDate SQLite precision discrepancyCoreData NSDate SQLite 精度差异
【发布时间】:2011-10-25 01:42:55
【问题描述】:

我看到了一些围绕这个主题的问题,但没有一个完全匹配。

我正在创建一个时间戳作为主键的一部分。时间戳使用 [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”。

这被发送到服务器,该服务器尽职地以毫秒精度存储它(因为这就是它所得到的全部)。然后当我检索日期时,对其进行反序列化并尝试对存储使用谓词提取,因为日期不相等,所以它不会返回记录。进行 比较是行不通的,因为它是主键...我需要 ==

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

希望有任何想法,或者解决这个问题的宝石单线......

【问题讨论】:

    标签: sqlite core-data nsdate precision


    【解决方案1】:

    虽然我不知道为什么会降低纳秒精度(这让我感到惊讶,你应该在上面设置雷达),但我可以说的是:

    时间戳是一个糟糕的主键。如果你能改变它,我强烈推荐它。

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

    更新

    从纯粹的数据库的角度来看,时间戳是一种痛苦(正如您所经历的那样)并且是浪费的,因为您从不按顺序使用所有时间戳。

    根据您尝试执行的操作,INT64 递增(使用 Core Data 并不容易)效果很好。如果您不仅将时间戳用于唯一键的一部分,那么我会将其保留为 NSTimeInterval (double),正如我上面建议的那样。这将保持您的精确度并避免弄乱字符串。请记住,字符串可能会很慢。

    【讨论】:

    • 感谢您的反馈。我有一种感觉,它与 NSDateFormatter 相关,现在我故意将日期推送到字符串并在存储之前再次返回,作为“规范化”它们的一种方式,以便它们能够在往返服务器的过程中存活下来。 (仍然希望有人能指出一些关于将 NSDate 限制为毫秒精度的代码!)
    • 我知道时间戳不是理想的主键,但它们实际上是两部分键的一部分,其中包括记录“所有者”的外键,并且仅在对用户交互的响应。我需要记录并显示实体的创建日期和时间(不能更改)。有兴趣了解您是否有特定原因我应该为纯粹的主键目的添加一个额外的列(代替时间戳)?
    • 只是整理我的问题......你的方法是合理的,他们只是不太符合我的需要。不管怎样,他们都希望能帮助其他人解决这个问题。
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2012-07-18
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多