2009-11-08 116 views
7

我正在使用fmdb来管理我的数据库。我找不到任何用于从fmdb中的表中删除行的示例。我试图如何删除sqlite数据库表中的一行?

NSString *[email protected]"DELETE from tableName WHERE id=3";  
    FMResultSet *rs = [database executeQuery:sqlStat]; 

但它不工作,因为当我检查项目总数的表,我得到了相同数量作为执行上述声明之前。 那么,使用fmdb从表中删除一行的正确方法是什么?

+0

你是如何确定表中的条目数? – 2009-11-08 11:17:49

+0

例如,我在做 FMResultSet * rs = [database executeQuery:@“select * from tableName”]; ,然后将结果存储在NSMutableArray中。 – MAX 2009-11-08 11:27:53

回答

12

如果你不把对象作为NSNumber传递,FMDB可能会有点挑剔。这是支持格式化查询的安全方式。

[db executeUpdate:@"DELETE FROM theTable WHERE id = ?", [NSNumber numberWithInt:myObject.id]]; 
+0

太棒了!这解决了我的问题! – Jon 2012-02-03 00:52:12

11

,就应该替换:

... [数据库的executeQuery:sqlStat] ...

有:

... [数据库的executeUpdate:sqlStat]。

此外,尝试添加:

[database beginTransaction]; 

之前,你的CRUD块,且:执行更新/删除/插入操作之后

[database commit]; 

;)

+0

不知道这是否会帮助其他人,但我使用命令行中的sqlite3,并在运行我的DELETE语句之后发出了'BEGIN TRANSACTION;'和'COMMIT;'后。我第一次使用CLI,这对我来说很有用。感谢您的提示,@弗洛林。 – harperville 2014-03-31 16:55:12

+0

np,@harperville :) – Florin 2014-04-02 17:49:38

+0

使用[database executeUpdate:sqlStat],其中sqlStat是“DELETE” – kokemomuke 2016-08-19 04:52:29

1

我也遇到了同样的症状。 和我的问题是我没有电话(而引发的“内存不足”的错误)

[db open]; 

一定要做到这一点,以调试FMDB发出 db.traceExecution = YES; db.logsErrors = YES;

0

你需要确保所有的进程

NSString *query = @"delete from places where published = 1"; 
const char *sqlStatement = [query UTF8String]; 
sqlite3_stmt *compiledStatement; 
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
    // Loop through the results and add them to the feeds array 
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
     // Read the data from the result row 
     NSLog(@"result is here"); 
    } 

    // Release the compiled statement from memory 
    sqlite3_finalize(compiledStatement); 

} 
int numberOfEffectedRow = sqlite3_changes(database); 
return numberOfEffectedRow; // get number of effected rows