Как получить столбец datetime в SQLite с Objective C
Как получить столбец datetime в SQLite с Objective C?
У меня есть таблица с 4 полями: pk
, datetime
, value1
и value2
. pk
(первичный ключ), value1
и value2
являются целыми числами, поэтому я использую:
int value1 = sqlite3_column_int(statement, 2); int value1 = sqlite3_column_int(statement, 3);
Но что я должен использовать для datetime
?
- Могут ли новые литералы Clang Objective-C перенаправляться на пользовательские classы?
- POST multipart / form-data с Objective-C
- Как декодировать поле полилиний API Google Directions в длинные точки lat в объективе C для iPhone?
- Можно ли отделить основную функцию и classы C ++ от подпрограмм Objective-C и / или C при компиляции и ссылке?
- Сравнение JSON Parser для Objective-C (JSON Framework, YAJL, TouchJSON и т. Д.)
- Calling -retainCount считается вредным
- TouchJSON, работающий с NSNull
- Использовать C ++ с Cocoa вместо Objective-C?
- Можно ли объявить dispatch_once_t предикат как переменную-член вместо статического?
- Как называется эта форма определения?
- Есть ли простой способ разделить NSString на массив символов?
- Класс эквивалентен методу -ответчик для выбора:
- В чем разница между и nil?
В SQLite не существует типа столбца даты / времени как такового, поэтому каждый из них представляет даты как значения даты Джулиана (реальные столбцы) или строки (текстовые столбцы). SQLite также очень специфичен в том, как даты представлены в строках, yyyy-MM-dd HH: mm: ss (only).
Это некоторые методы, которые я написал для работы с датами SQLite от Objective-C. Эти методы реализованы в категории по NSDate.
Обязательно ознакомьтесь с функциональностью, предлагаемой SQLite для работы с датами Джулиана. Я нашел их весьма полезными ( http://www.sqlite.org/lang_datefunc.html ). Функция для получения julianDay NSDate включена в пример кода.
Похоже, этот вопрос также был освещен здесь. Сохранение дат SQLite3 в приложении для iPhone
+ (NSDate *) dateWithSQLiteRepresentation: (NSString *) myString; { NSAssert3(myString, @"%s: %d; %s; Invalid argument. myString == nil", __FILE__, __LINE__, __PRETTY_FUNCTION__); return [[self sqlLiteDateFormatter] dateFromString: myString]; } + (NSDate *) dateWithSQLiteRepresentation: (NSString *) myString timeZone: (NSString *) myTimeZone; { NSString * dateWithTimezone = nil; NSDate * result = nil; NSAssert3(myString, @"%s: %d; %s; Invalid argument. myString == nil", __FILE__, __LINE__, __PRETTY_FUNCTION__); NSAssert3(myTimeZone, @"%s: %d; %s; Invalid argument. myTimeZone == nil", __FILE__, __LINE__, __PRETTY_FUNCTION__); dateWithTimezone = [[NSString alloc] initWithFormat: @"%@ %@", myString, myTimeZone]; result = [[self sqlLiteDateFormatterWithTimezone] dateFromString: dateWithTimezone]; [dateWithTimezone release]; return result; } + (NSString *) sqlLiteDateFormat; { return @"yyyy-MM-dd HH:mm:ss"; } + (NSString *) sqlLiteDateFormatWithTimeZone; { static NSString * result = nil; if (!result) { result = [[NSString alloc] initWithFormat: @"%@ zzz", [self sqlLiteDateFormat]]; } return result; } + (NSDateFormatter *) sqlLiteDateFormatter; { static NSDateFormatter * _result = nil; if (!_result) { _result = [[NSDateFormatter alloc] init]; [_result setDateFormat: [self sqlLiteDateFormat]]; } return _result; } + (NSDateFormatter *) sqlLiteDateFormatterWithTimezone; { static NSDateFormatter * _result = nil; if (!_result) { _result = [[NSDateFormatter alloc] init]; [_result setDateFormat: [self sqlLiteDateFormatWithTimeZone]]; } return _result; } - (NSString *) sqlLiteDateRepresentation; { NSString * result = nil; result = [[NSDate sqlLiteDateFormatter] stringFromDate: self]; return result; } - (NSTimeInterval) unixTime; { NSTimeInterval result = [self timeIntervalSince1970]; return result; } #define SECONDS_PER_DAY 86400 #define JULIAN_DAY_OF_ZERO_UNIX_TIME 2440587.5 - (NSTimeInterval) julianDay; { return [self unixTime]/SECONDS_PER_DAY + JULIAN_DAY_OF_ZERO_UNIX_TIME; } + (NSDate *) dateWithJulianDay: (NSTimeInterval) myTimeInterval { NSDate *result = [self dateWithTimeIntervalSince1970: (myTimeInterval - JULIAN_DAY_OF_ZERO_UNIX_TIME) * SECONDS_PER_DAY]; return result; }
Если вы можете определить базу данных, тогда ou также может использовать REAL (тип данных SQLite) в качестве типа для datetime, а затем загрузить его с помощью sqlite3_column_double()
. Это вернет переменную типа double
.
Затем вы можете использовать [NSDate dateWithTimeIntervalSince1970:double_value]
чтобы получить объект NSDate
.
Обратите внимание, что решение категории выше имеет проблему в том, что оно зависит от настроек локали на устройстве пользователя. Например, в полночь 5 апреля 2010 года sqlLiteDateRepresentation выше вернется 2010/04/05 00:00:00 для компьютеров большинства людей, однако я столкнулся с сценарием, в котором параметры локали пользователя вызвали одну и ту же функцию для создания «2010/04/05 12:00:00 утра “, который при использовании в моем запросе не возвращает никаких строк. Это, как видно из документации NSDateFormatter: «В общем, вам рекомендуется использовать стили формата (см. TimeStyle, dateStyle и NSDateFormatterStyle), а не использовать строки пользовательского формата, поскольку формат для данного стиля отражает предпочтения пользователя. стили также отражают настройку локали ». Хотя я не видел хороший способ использовать timeStyle / dateStyle для получения того же формата, что и yyyy / MM / dd HH: mm: ss, который, по-видимому, нужен SQLite. Я боюсь, что ваш лучший выбор, скорее всего, является обычным решением, в котором вы гарантируете, что время определенно написано в формате 24H, не позволяйте языковым настройкам вызывать ошибки.
Если вы просто хотите получить NSDate из поля datetime SQLite, где dateTime – это поле, возвращаемое из базы данных:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *date = [dateFormatter dateFromString:dateTime];
Теперь работать!
NSString *dateValueS = [[NSString alloc] initWithUTF8String:(char*) sqlite3_column_text(statement,2)];