我觉得我已经阅读了FMDB的文档一百万次。我不知道为什么这个代码不起作用 - 我已经尝试了executeUpdate方法和executeMethodWithFormat及其相应的格式,似乎都不起作用。 _dbArray是一个dictionarys数组。这些行返回正确的值 - 如果我复制并粘贴结果并在终端中运行查询,它将删除记录正常。我错过了一些明显的东西吗?
- (IBAction)deleteDbEntry:(id)sender {
// get selected row
NSInteger row = [_dataTable selectedRow];
// get the entry number
NSString *idToDelete = [[_dbArray objectAtIndex:row] valueForKey:@"entryColumn"];
// open DB for writing
if (![db open]) {
[db open];
}
[db executeUpdate:@"DELETE FROM tbl1 WHERE entry = ?", idToDelete];
// close DB
if ([db open]) {
[db close];
}
[_dataTable reloadData];
return;
}
更新:我已经接受了你的建议但它仍然无效,我不知道为什么。数据库的打开和关闭现在正在其他地方发生(谢谢@ccgus),我正在将字符串转换为NSNumber(感谢@bryanmac)。 NSLog(@"myNumber is %@", myNumber);
调用正在返回正确的号码,我可以确认删除没有发生。 NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);
报告没有错误(Error 0: (null)
)。我也尝试过:
[db executeUpdateWithFormat:@"DELETE FROM tbl1 WHERE entry = %@", myNumber];
和
[db executeUpdate:@"DELETE FROM tbl1 WHERE id = ?", [NSNumber numberWithInt:myNumber]];
第一个似乎应该工作,但我已经确认它不会删除该行。我的第二个错误是“与指针转换不兼容的整数”。我错过了什么?
- (IBAction)deleteDbEntry:(id)sender {
// get selected row
NSInteger row = [_dataTable selectedRow];
// get the entry number
NSString *idToDelete = [[_dbArray objectAtIndex:row] valueForKey:@"entryColumn"];
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber *myNumber = [f numberFromString:idToDelete];
NSLog(@"myNumber is %@", myNumber);
[db executeUpdate:@"DELETE FROM tbl1 WHERE entry = ?", myNumber];
NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);
[_dataTable reloadData];
return;
}
答案 0 :(得分:6)
你的id是int吗?
如果是这样,请尝试将NSNumber传递给格式化的更新语句。
这篇文章可以将NSString转换为NSNumber。
How to convert an NSString into an NSNumber
[db executeUpdate:@"DELETE FROM tbl1 WHERE entry = ?", idNumber];
以下是相关帖子:
How to delete a row in a sqlite database table?
另外,请确保在发言后检查错误:
NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);
答案 1 :(得分:2)
尝试在查询之前打印出您的值,以确保获得预期效果。
此外,经常打开和关闭数据库并不是一个好主意 - 只需打开一次并将其分配给实例中的ivar,然后在dealloc(或者确实需要关闭它)时关闭它。 / p>
-gus(编写fmdb的人)
答案 2 :(得分:0)
尝试添加:
[database beginTransaction];
在CRUD阻止之前,并且:
[database commit];
执行更新/删除/插入操作后。加executeUpdate
是正确的 -
[database executeUpdate:sqlStat];