2

アプリで非常に厄介な問題が発生しています。"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 句の日付が null であるため、ユーザーはレコードを表示できません。

では、その「m」はどこにあるのでしょうか。から来た?どういう意味ですか?この問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

NSDateFormatter を使用しないでください。アプリが大幅に遅くなります。

UNIX タイムスタンプ (1970) を使用する必要があります。このようなsqlite3_bind_double(statement, index, [dateObject timeIntervalSince1970]);

取得:

[NSDate dateWithTimeIntervalSince1970:doubleValueFromDatabase];
于 2012-04-07T15:11:31.960 に答える