У меня есть сомнения, можно ли NSDate напрямую хранить или читать из базы данных с помощью FMDatabase или нет.
Согласно моим исследованиям, FMDatabase считывает дату из записи, ожидая, что этот кортеж будет двойным значением. FMDatabase преобразует это двойное значение в дату следующим методом:
- (NSDate*) dateForColumn:(NSString*)columnName; {
int columnIdx = [self columnIndexForName:columnName];
if (columnIdx == -1) {
return nil;
}
return [NSDate dateWithTimeIntervalSince1970:[self doubleForColumn:columnName]];
}
Основная проблема при таком подходе в том, что человеку, вручную вносящему данные в БД, будет сложно сделать так, чтобы FMDatabase понимал их в коде. Таким образом, кто-то не может просто ввести дату в двойном значении в графическом интерфейсе. Один из подходов заключается в использовании одной из этих функций.
date(timestring, modifier, modifier, ...)
time(timestring, modifier, modifier, ...)
datetime(timestring, modifier, modifier, ...)
julianday(timestring, modifier, modifier, ...)
strftime(format, timestring, modifier, modifier, ...)
Но накладные расходы здесь снова заключаются в том, чтобы каждый раз запускать запрос для ввода записи с помощью операции вставки, подобной этой:
Compute the current date.
SELECT date('now');
Compute the last day of the current month.
SELECT date('now','start of month','+1 month','-1 day');
Я хочу, чтобы дата сохранялась в базе данных в следующем формате:
TEXT as ISO8601 strings ("YYYY-MM-DD")
И сохраните его в формате даты в базе данных, чтобы я мог:
- Используйте средство сравнения дат в запросах.
- Сделайте FMDatabase понятным для чтения и записи в этом формате даты.
Есть ли какой-либо прямой способ взаимодействия FMDatabase с таким форматом даты? Или это ограничение FMDatabase, и мне придется расширить класс FMDatabase для обработки чтения и записи NSDate в формат даты sqlite?
Спасибо
Изменить: один из авторов/модераторов FMDatabase должен сказать это об этом: http://code.google.com/p/flycode/issues/detail?id=16#c1