Как получить столбец 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 ?

В 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)]; 
  • NSString - целое число?
  • Декодирование JSON в NSArray или NSDictionary
  • Использование alloc init вместо нового
  • В чем разница между строковой константой и строковым литералом?
  • Как создать хеш-файл MD5 в Cocoa?
  • Смешивание Objective-C и C ++
  • Механизм отправки сообщения Objective C
  • Быстрый базовый class Swift или NSObject
  • Как можно разрабатывать приложения для iPhone на Java?
  • Как я могу рассчитать разницу между двумя датами?
  • Что такое Objective C ++?
  • Давайте будем гением компьютера.