【发布时间】:2014-08-27 21:53:06
【问题描述】:
我有一个不工作的 FMDB 更新查询。这是我的代码:
FMDatabase *db = [self openDatabase];
if (![db open]) {
return;
}
NSString *updateMeeting = [NSString stringWithFormat:@"UPDATE meetings SET MEETING_DESCRIPTION=\"%@\" WHERE MEETING_ID=\"%@\"",meeting.meetingDescription, meeting.meetingId];
[db beginTransaction];
[db executeQuery:updateMeeting];
[db commit];
[db close];
这些是我检查过的:
- 我传递的属性是对象而不是 nil。
- 网上有的地方用\"%@\",有的用'%@',有的用%@,有的用?。这些都不适合我。
-
我 NSLoged 我的字符串,它看起来像这样:
UPDATE meetings SET MEETING_DESCRIPTION="AAA12" WHERE MEETING_ID="791D8251-2FC4-498B-85B3-C1002C04E329:F1C40061-1308-4179-B72E-7E3EEDB85E1A" 我想我的数据库可能找不到这个 meetingID,所以我运行了一个 SELECT 查询这个 messageID 并找到了它。
我几乎绝望了。谁能想到我没试过的东西?
谢谢
【问题讨论】:
-
很高兴您发现了
executeUpdate与executeQuery的问题。一些不相关的观察: 1. 绝对使用?占位符(不带引号)并将meetingDescription和meetingId作为参数传递给executeUpdate方法。这在执行插入任何用户输入的 SQL 时至关重要(因为stringWithFormat不会正确转义用户输入中的引号,而?占位符方法完全绕过了这个问题)。 -
2.在执行单个
UPDATE语句时,beginTransaction和commit是不必要的(SQLite 在您执行它们时自动提交每个更新语句)。如果在单个事务中执行许多更新 SQL 语句,那么beginTransaction和commit非常有用,但是在执行单个UPDATE语句时,它是不必要的(虽然没有坏处)。 3. 我建议你总是检查这些 FMDB 方法的返回值,否则你就瞎了。对于UPDATE语句,您可能还需要调用[db changes]来确认更新了多少行。
标签: objective-c fmdb