Objective-C和sqlite的DATETIME类型

时间:2008-11-19 17:17:50

标签: objective-c sqlite

我有一个sqlite3表,我试图映射到objective-C中的对象。该表的一个属性是'completed_at',它存储为DATETIME。

我想在Objective-C类(继承自NSObject)上创建一个属性,该属性将很好地映射到'completed_at'属性。

Objective-C有一个NSDate类型,但我不确定它是否会直接映射?

4 个答案:

答案 0 :(得分:28)

我在这里只分享有关日期格式的核心内容,用于保存和检索演示数据。如果您对此代码段有任何问题,那么我将分享我用于项目的完整代码。

保存数据时,请像这样在sql语句中绑定日期值:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString=[dateFormat stringFromDate:[NSDate date]];

    sqlite3_bind_text(saveStmt, 1, [dateString UTF8String] , -1, SQLITE_TRANSIENT);

当您检索数据时,您必须编写此代码:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *myDate =[dateFormat dateFromString:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]];

现在您有一个NSDate类型的变量myDate,您可以按照自己的方式进行渲染:

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"dd-MM-yyyy hh:mm:ss a"];
    NSLog(@"My Date was : %@", [formatter stringFromDate:myDate]);

你必须要记住三件事:

  1. 在您的SQLite日期字段中,类型应为DATETIME
  2. 存储和检索时日期格式应相同
  3. 现在您可以按照自己的方式显示但是遵循格式。格式详情如下。
  4. 格式:

       'dd' = Day 01-31
       'MM' = Month 01-12
       'yyyy' = Year 2000
       'HH' = Hour in 24 hour
       'hh' = Hour in 12 hour
       'mm' = Minute 00-59
       'ss' = Second 00-59
       'a' = AM / PM
    

答案 1 :(得分:4)

我对Objective-C没有任何经验,但我发现Apple的NSDate Class Reference有谷歌搜索。通过链接页面上提供的信息,您应该能够弄清楚如何在Objective-C中操作32位纪元时间,这在SQLite中可以很好地工作。我可能会将completed_at列创建为类型为INTEGER的32位时间。

SQLite真的更喜欢Julian日期,它们是浮点数。我没有找到任何文件来解释如何强迫NSDate课程与朱利安一起工作。

timeIntervalSince1970看起来非常有趣。

答案 2 :(得分:2)

答案 3 :(得分:2)

如果您尝试影响演示文稿,格式化程序很重要,但如果您对内部存储使用if,那么您定义的字符串可能会破坏DB引擎使用该值进行计算,比较,排序等的能力。此外,如果您要让不同的客户端将日期值插入到DB中,则必须在任何地方编写转换函数。我使用了以下内容,它按预期工作(架构的列定义为DATETIME):

dateExpires = [NSDate dateWithTimeIntervalSinceNow: sqlite3_column_double(queryStmt, 5)];

我在中央时区插入带有Firefox插件的SQLITE3数据库为“4/12/2010”。在XCode-debugger中查看'dateExpires'的值显示为:

2010-04-12 23:19:48 -0500

果然,这是正确的时间。

此外,要插入SQLITE DB,您将设置值[NSDate date]