2009-11-10 3 views
4

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

+1

Использования обертки. Вот некоторые из них: http://cocoaheads.byu.edu/resources/sqlite –

+0

Это может быть дубликат этих вопросов: http://stackoverflow.com/questions/251155/persisting-dates-to-sqlite3-in- приложение-iphone, http: // stackoverflow.com/questions/942188/sqlite-datetime-data-type-with-iphone-nsdate –

ответ

4

Если вы можете определить базу данных, тогда ou также может использовать REAL (тип данных SQLite) в качестве типа для datetime, а затем загрузить его с помощью sqlite3_column_double(). Это вернет переменную типа double.

Тогда вы можете использовать [NSDate dateWithTimeIntervalSince1970:double_value], чтобы получить объект NSDate.

+0

Это странно, потому что официальная документация SQLite говорит о том, как использовать REAL-номера для хранения дат: _REAL в качестве чисел Julian day, количество дней с полудня в Гринвиче 24 ноября 4714 г. до н.э. согласно пролептическому григорианскому календарю. [http://www.sqlite.org/datatype3.html] –

11

В SQLite не существует типа столбца даты/времени как такового, поэтому каждый из них представляет даты как значения даты Джулиана (реальные столбцы) или строки (текстовые столбцы). SQLite также очень специфичен в том, как даты представлены в строках, yyyy-MM-dd HH: mm: ss (only).

Это некоторые методы, которые я написал для работы с датами SQLite от Objective-C. Эти методы реализованы в категории по NSDate.

Обязательно ознакомьтесь с функциональностью, предлагаемой SQLite для работы с датами Джулиана. Я нашел, что они очень полезны (http://www.sqlite.org/lang_datefunc.html). Функция для получения julianDay NSDate включена в пример кода.

Похоже, что этот предмет также был освещен здесь. Persisting Dates to SQLite3 in an iPhone Application

+ (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; 
} 
+0

Это очень полезно! Однако моя проблема в том, что когда я пытаюсь использовать: NSString * dateValue = [NSString stringWithUTF8String: (char *) sqlite3_column_text (statement, 1)]; iPhone попадает в аварии! :( Что случилось? – Undolog

+0

Какая ошибка? – xyzzycoder

+0

Почему вы выбрасываете (char)? – xyzzycoder

-4

Теперь работать!

NSString *dateValueS = [[NSString alloc] 
    initWithUTF8String:(char*) sqlite3_column_text(statement,2)]; 
+1

Почему вы принимаете свой ответ в качестве ответа, когда на самом деле это не ответ? То, что вы вставили здесь, это просто строка для чтения строкового значения из столбца db. – jbasko

0

Обратите внимание, что решение категории выше имеет проблемы с тем, что оно зависит от настроек локали на устройстве пользователя. Например, в полночь 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, не позволяйте языковым настройкам вызывать ошибки.

+0

Какие изменения вы рекомендуете исправить? – xyzzycoder

+0

Извините, я так долго не видел этого, я действительно мог обмануть мои обстоятельства, потому что для всех моих запросов время было неактуальным, имела значение только дата. Таким образом, я смог жестко привязать свои строки к 00:00:00. Очевидно, что это не подходит для общей категории. Категории необходимо будет проанализировать строку, проверить наличие m.m или p.m., если найдено отдельную строку на '', а затем манипулировать временной строкой для преобразования из формата 12H в 24H и перестроить строку. –

0

Если вы просто хотите, чтобы получить NSDate из SQLite поля даты и времени, где DATETIME является поле, возвращенным из базы данных:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSDate *date = [dateFormatter dateFromString:dateTime]; 
Смежные вопросы