iphone sqlite NSDate ошибка - PullRequest
       15

iphone sqlite NSDate ошибка

0 голосов
/ 07 декабря 2009

Я использую основные данные в своем приложении для iphone, но в некоторых случаях я использую sqlite для доступа к данным, и у меня возникла проблема с NSDate.

NSDate *now = [NSDate date];
        NSCalendar *calender = [NSCalendar currentCalendar];;
        NSDateComponents *comp = [calender components:NSYearCalendarUnit fromDate:now];
        [comp setDay:1];
        [comp setMonth:1];
        NSDate *yearAgo = [calender dateFromComponents:comp];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date > %@",yearAgo];

Этот код работает и выбирает записи с начала года, но если я использую sqlite raw query

NSDate *current=[NSDate date];
            NSDateComponents *comps = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit |NSYearCalendarUnit) fromDate:current];
            [comps setDay:1];
            [comps setMonth:1];

            NSDate *yearDate = [gregorian dateFromComponents:comps];

            [where appendFormat:@"zdate > '%@' ",yearDate];

У меня проблема, неправильная дата, определенная записями. Записи, в основной дате которых есть дата, например 2008-01-01, в sqlite имеют даты, например 1977 год. Как это исправить? Может быть, я неправильно использовал NSDate в запросе?

Ответы [ 4 ]

3 голосов
/ 07 декабря 2009

В некоторых случаях вам нужно добавить 31 год к датам в БД SQLite.

Из книги: Экспертиза iPhone: восстановление доказательств, личных данных и корпоративных активов Джонатан Здзиарски По календарным событиям:

В отличие от большинства временных меток, используемых на iPhone, которые являются стандартными Unix метки времени, метка времени, используемая здесь является меткой времени RFC 822, представляющей дата смещена на 1977 год. Для конвертации эту дату, определить фактический RFC 822 отметка времени и добавление 31 года.

2 голосов
/ 07 декабря 2009

Для выполнения любого запроса или другой операции SQLLite вы должны всегда (всегда !!!) использовать переменные связывания. Таким образом, запрос будет выглядеть так:

zdate > ?

Затем вы делаете подготовленный оператор, связываете переменную даты и выполняете оператор, чтобы получить свои результаты.

1 голос
/ 07 декабря 2009

Я не проверял это, но мне бы хотелось, чтобы sqlite ожидал другого формата даты. Подумайте об использовании NSDateFormatter для преобразования его в одно использование sqlite.

0 голосов
/ 07 декабря 2009

Неправильное использование NSDate в предикате!

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date > %@",yearAgo]; - worng

Я должен использовать это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date > '%f'",[yearAgo timeIntervalSinceReferenceDate];

И все работает.

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