【问题标题】:NSDate and SQLite3NSDate 和 SQLite3
【发布时间】:2012-04-07 15:04:25
【问题描述】:

我的应用遇到了一个非常烦人的问题。 让我们在名为“daily”的表中有一个 sqlite3 数据库和一个 datetime 列。

- (BOOL)eatQuantity:(NSNumber *)quantity date:(NSDate *)date
{
    User *usr = [User loadCurrentUser];

    BOOL ret;
    sqlite3 *db;

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *strDate = [dateFormatter stringFromDate:date];
    [dateFormatter release];

    NSString *query = [NSString stringWithFormat:@"INSERT INTO daily (id_user, id_food, quantity, date) VALUES (%d, %d, %f, '%@')", usr.idPk.intValue, self.idPk.intValue, quantity.floatValue, strDate];
    NSLog(@"Query: %@", query);

当我调用从 UIDatePicker 传递 NSDate 对象的此方法时,一些用户在使用 NSDate 时遇到了奇怪的行为,他们将其记录在控制台上:

查询:INSERT INTO daily (id_user, id_food, quantity, date) VALUES (1, 1010, 130.000000, '2011-12-21 01:20:09 m.')

但 sqlite3 无法存储日期是这样一种格式,如以“m”结尾的格式。细绳。由于 WHERE 子句中的日期为空,用户无法查看任何记录。

所以那个“m”在哪里。来自?这是什么意思?我该如何解决这个问题?

【问题讨论】:

    标签: ios sqlite nsdate


    【解决方案1】:

    不要使用 NSDateFormatter 它会大大降低您的应用程序的速度。

    您应该使用 unix 时间戳 (1970)。 赞这个sqlite3_bind_double(statement, index, [dateObject timeIntervalSince1970]);

    检索:

    [NSDate dateWithTimeIntervalSince1970:doubleValueFromDatabase];
    

    【讨论】:

    • +1 我不确定m. 来自哪里,但这可能会更好。或者,您可以显式设置 NSDateFormatter 的语言环境,以保证无论用户当前的语言环境是什么,它都会生成相同的样式字符串。
    • 我需要使用 NSDateFormatter 因为我以 sql 的日期格式存储日期。我现在无法更改数据库的设计。我将尝试使用 nsdateformatter 的语言环境。我会告诉你它是否有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多