使用FMDB从SQLite数据库中删除行

时间:2012-02-28 03:28:40

标签: objective-c cocoa sqlite fmdb

我觉得我已经阅读了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;
} 

3 个答案:

答案 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];