Objective-C и sqlite тип DATETIME - PullRequest
       14

Objective-C и sqlite тип DATETIME

7 голосов
/ 19 ноября 2008

У меня есть таблица sqlite3, которую я пытаюсь сопоставить с объектом в target-C. Одним из атрибутов таблицы является «complete_at», который сохраняется как DATETIME.

Я хочу создать свойство в моем классе target-C (который наследуется от NSObject), которое будет хорошо отображаться в атрибуте complete_at.

Objective-C имеет тип NSDate, но я не уверен, что это будет отображаться напрямую?

Ответы [ 4 ]

28 голосов
/ 18 августа 2011

Я делюсь здесь только основными моментами, касающимися форматирования даты для сохранения и извлечения данных для представления. Если у вас возникнут проблемы с этим фрагментом кода, я поделюсь полным кодом, который я использовал для своего проекта.

Когда вы сохраняете свои данные, привязывайте значение даты в выражении sql следующим образом:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString=[dateFormat stringFromDate:[NSDate date]];

    sqlite3_bind_text(saveStmt, 1, [dateString UTF8String] , -1, SQLITE_TRANSIENT);

и когда вы получаете данные, вы должны написать этот код:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *myDate =[dateFormat dateFromString:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]];

теперь у вас есть переменная myDate типа NSDate, которую вы можете отобразить по-своему:

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"dd-MM-yyyy hh:mm:ss a"];
    NSLog(@"My Date was : %@", [formatter stringFromDate:myDate]);

Вы должны помнить три вещи:

  1. В вашем поле даты типа SQLite должно быть DATETIME
  2. Формат даты должен быть одинаковым при хранении и при извлечении
  3. Теперь вы можете показывать по-своему, но следуя формату. Ниже приведены подробности формата.

Формат:

   'dd' = Day 01-31
   'MM' = Month 01-12
   'yyyy' = Year 2000
   'HH' = Hour in 24 hour
   'hh' = Hour in 12 hour
   'mm' = Minute 00-59
   'ss' = Second 00-59
   'a' = AM / PM
4 голосов
/ 19 ноября 2008

У меня нулевой опыт работы с Objective-C, но я нашел Apple NSDate Class Reference с поиском в Google. С помощью информации, представленной на связанной странице, вы сможете понять, как манипулировать 32-битными временами эпох в Objective-C, и это хорошо работает в SQLite. Я бы, вероятно, создал столбец complete_at типа INTEGER для 32-битных раз.

SQLite действительно предпочитает юлианские даты, которые являются числами с плавающей точкой. Я не нашел никакой документации, объясняющей, как можно заставить класс NSDate работать с Джулианами.

timeIntervalSince1970 выглядит очень интересно.

2 голосов
/ 13 апреля 2010

Форматтер важен, если вы пытаетесь произвести презентацию, но если вы используете if для внутреннего хранения, вы определяете строку, которая может нарушить способность DB-engine использовать значение для вычисления, сравнения, сортировки и т. Д. Кроме того, если у вас будут разные клиенты, вставляющие значение даты в БД, вам придется везде писать функции преобразования. Я использовал следующее, и оно работало, как и ожидалось (столбец схемы определен как DATETIME):

dateExpires = [NSDate dateWithTimeIntervalSinceNow: sqlite3_column_double(queryStmt, 5)];

Я вставил в базу данных SQLITE3 с надстройкой Firefox как «4/12/2010» здесь, в центральном часовом поясе. Просмотр значения dateExpires в XCode-отладчике отображается как:

2010-04-12 23:19:48 -0500

Конечно, это правильное время.

Кроме того, для вставки в БД SQLITE вы должны указать значение [NSDate date]

2 голосов
/ 20 ноября 2008

Это появилось пару недель назад:

Сохраняющиеся даты для SQLite3 в приложении iPhone

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...