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

Posted

技术标签:

【中文标题】使用 NSDate 的 FMDB 查询执行但不生效【英文标题】:FMDB queries with NSDate execute but do not take effect 【发布时间】:2011-07-19 00:50:27 【问题描述】:

我通过 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 中使用存储在模拟应用程序上下文中的数据库进行这些查询时,它们可以工作。是否有一些特殊的准备可以通过 NSDate 与我缺少的 FMDB 进行查询?

【问题讨论】:

【参考方案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 不,不会工作。 FMDB 的行为并非如此。另外,建议使用+stringWithFormat: 是错误的。 FMDB 有其他方法(如 executeQueryWithFormat:)是您正在寻找的。​​span> 我补充说我没有测试过这些。如果你有一个工作方法。请与我们所有人分享。【参考方案2】:

尽量避免将 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"]; 

【讨论】:

【参考方案3】:

可能你使用过executeQuery 方法。 删除操作属于更新操作。一开始我用executeQuery,但是一次又一次地检查属性类型也找不到问题。最后executeUpdate 修复了它。

【讨论】:

以上是关于使用 NSDate 的 FMDB 查询执行但不生效的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift FMDB 中使用 executeQuery() 执行基于条件的查询

FMDB 使用方法

FMDB 使用方法简介

iOS中FMDB按条件查询数据

FMDB 的基本操作

使用 fmdb 写入 sqlite db?