【问题标题】:Persisting Dates to SQLite3 in an iPhone Application在 iPhone 应用程序中将日期持久化到 SQLite3
【发布时间】:2010-09-20 01:14:58
【问题描述】:

我正在开发一个将数据保存到 SQLite3 数据库的 iPhone 应用程序。

对于我坚持的每一行,我希望包括一个“创建日期”和一个“最后修改日期”

我的问题是将这些信息存储在表格中的推荐方法是什么?

这些属性在我的应用程序中表示为 NSDate,但我不确定如何在我的表中表示此信息。

SQLite3 似乎提供了 DATETIME 类型,但对如何解析此信息没有原生的理解。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

    标签: iphone cocoa-touch sqlite


    【解决方案1】:

    我通常使用双精度,例如:

    sqlite3_bind_double(statement, index, [dateObject timeIntervalSince1970]);
    

    其中 dateObject 是 NSDate*。然后,当从数据库中取出数据时,使用

    [NSDate dateWithTimeIntervalSince1970:doubleValueFromDatabase];
    

    【讨论】:

    【解决方案2】:

    在 UNSIGNED INT 列中存储为典型的 C 时间(例如 time() 返回的 time_t/int 值)值。像 drewh 用 NSDate 说的那样转换:

    - timeIntervalSince1970
    - dateWithTimeIntervalSince1970:(double)value
    

    除了存储为整数,除非您需要亚秒级粒度(通常,对于 created-on/last-modified 来说,这是多余的)。无符号整数比双精度整数小得多,也更容易处理。虽然这在大多数桌面和 Web 应用程序中可能不再重要,但它肯定对 iPhone 有帮助。每一点都有帮助。

    大多数人没有意识到的 C-time 的一个附带好处是它们与时区无关。如果您需要支持多个时区,这会派上用场。

    【讨论】:

      【解决方案3】:

      我在 ISO8601 字符串之间进行转换:http://en.wikipedia.org/wiki/ISO_8601

      比时间间隔更具可读性/可破解性。

      【讨论】:

      • 这里也一样。当然它会占用更多空间,但在调试会话中阅读会更好。
      • 你如何对这些进行 NSPredicate 日期范围搜索?
      【解决方案4】:

      According to the docs 没有 DATETIME 数据类型!我使用 real 数据类型并使用 timeIntervalSinceReferenceDate 方法将 NSDate 转换为 real

      【讨论】:

        【解决方案5】:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 2011-02-24
        相关资源
        最近更新 更多