Запросы FMDB с NSDate выполняются, но не вступают в силу - PullRequest
1 голос
/ 19 июля 2011

Любой запрос, который я выполняю через FMDB, включает NSDates, но не возвращает наборы результатов или вносит изменения в базу данных.Я работаю в симуляторе ios 4.3. Другие запросы, в которых не указана дата, выполняются правильно.Вот пример кода, который я использую:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh-mm-ss"];

NSDate *start = [dateFormatter dateFromString:@"2011-07-18 06:40:21" ];
NSDate *end = [dateFormatter dateFromString:@"2011-07-18 06:41:19"];

[dateFormatter release];

FMDatabase* db = [FMDatabase databaseWithPath:appDelegate.databasePath];
if (![db open]) {
NSLog(@"Could not open db.");
}

[db beginTransaction];
[db executeUpdate:@"delete from time_stamp_table where time_stamp >= ? 
and time_stamp <= ?",start,end];

NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
[db commit];
[db close];

Схема заявляет time_stamp в time_stamped_table таким образом:

create table time_stamp_table{
id INTEGER PRIMARY KEY,
time_stamp DATETIME NOT NULL
}

Когда я делаю эти запросы в sqlite3 в командной строке, используябаза данных хранится в смоделированном контексте приложения, они работают.Есть ли какая-то специальная подготовка для запроса NSDate с FMDB, которую я пропускаю?

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Запрос типа

 SELECT *  from Time_Stamp where updatedTime >= DATE('2011-05-17 06:40:21') AND updatedTime <= DATE('2011-07-19 06:40:21')

извлекает правильные записи при сравнении дат.Вы можете извлечь из этого подсказку и изменить свой запрос на что-то вроде

 [db executeUpdate:@"delete from time_stamp_table where time_stamp >= DATE(?) 
and time_stamp <= DATE(?)",start,end];

или

 [db executeQuery:[NSString stringwithFormat:@"delete from time_stamp_table where time_stamp >= DATE('%@') 
and time_stamp <= DATE('%@')",start,end];

Я не проверял запросы, поэтому вам придется проверять их самостоятельно.Надеюсь, это поможет

0 голосов
/ 30 сентября 2016

Может быть, вы использовали executeQuery метод. Удалить операция относится к операции обновления. Сначала я использовал executeQuery, но не смог найти проблему, даже проверяя тип свойства раз и снова. Наконец executeUpdate исправляет это.

0 голосов
/ 24 июля 2011

Старайтесь избегать парсинга NSDate в SQL-запрос. Скорее попробуйте разобрать строку NSString в формате, который sqlite может понять: «2011-07-18 06:41:19». Если вы хотите, чтобы sqlite сравнивал значения, вы должны использовать определенную функцию даты. Sqlite3 предоставляет вам функции DATE, TIME или DATETIME для преобразования ваших строк.

Во-вторых, чтобы исправить Рахула Шарму, использование функции DATE для сравнения TIMESTAMP не удастся, потому что TIMESTAMP сохраняет дату и время. Поэтому следует использовать функцию DATETIME.

[db executeUpdate:@"delete from time_stamp_table where time_stamp >= DATETIME(?) 
                                                   and time_stamp <= DATETIME(?);",
                    @"2011-07-18 06:40:21",
                    @"2011-07-18 06:41:19"]; 
...