使用NSDate执行FMDB查询但不生效

时间:2011-07-19 00:50:28

标签: iphone nsdate fmdb

我通过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_stamped_table中声明了time_stamp:

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

当我在命令行的sqlite3中进行这些查询时,使用存储在模拟的Application上下文中的数据库,它们可以工作。 NSDate使用FMDB查询是否有一些特殊的准备工作我不知道?

3 个答案:

答案 0 :(得分:1)

一样查询
 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];

我没有测试过这些查询,所以你必须自己测试一下。希望它有所帮助

答案 1 :(得分:0)

尽量避免将NSDate解析为SQL查询。而是尝试以sqlite格式解析NSString:'2011-07-18 06:41:19'。 如果您希望sqlite比较值,您必须使用特定的日期函数。 Sqlite3为您提供DATE, TIME or DATETIME函数来转换字符串。

其次,为了纠正Rahul Sharma,使用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"]; 

答案 2 :(得分:0)

可能您使用过executeQuery方法。 删除操作属于更新操作。起初,我使用了executeQuery,但即使一次又一次检查属性类型,也无法找到问题。最后executeUpdate修复了它。