2012-02-28 73 views
2

我觉得我已经读了一百万次FMDB的文档。我不知道为什么这个代码不工作 - 我已经尝试过executeUpdate方法和executeMethodWithFormat及其相应的格式,似乎都没有工作。 _dbArray是一个字典数组。这些行将返回正确的值 - 如果我复制并粘贴结果并在终端中运行查询,它将删除记录正常。我错过了一些明显的东西?使用FMDB从SQLite数据库删除行

- (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

http:// novasys。in/2013/11/22/fmdb-implimentation-ios-applications/ – sohil 2016-11-30 17:52:19

+0

http://www.brianjcoleman.com/framework-using-fmdb-to-communicate-with-sqlite-databases/ – sohil 2016-11-30 17:52:30

回答

5

是您的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]); 
+0

ID是一个字符串,我已经尝试转换为NSInteger现在,但仍然没有骰子。错误返回一切都很好。 – rick 2012-02-28 14:35:01

+0

这让我走上了正确的道路 - 谢谢@ bryanmac! – rick 2012-02-28 16:29:55

0

尝试添加:

[database beginTransaction]; 

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

[database commit]; 

。另外executeUpdate是正确─

[database executeUpdate:sqlStat];

+0

每个语句都有一个隐式事务对?你应该只需要,如果你想要一个交易跨越呼... – bryanmac 2012-02-28 04:20:27

+0

不是,我的印象是,sqlite是事务性的。因此,任何更新,插入或删除都需要'beginTransaction'&'commit'。纠正我,如果我错了... – 2012-02-28 04:50:39

+0

http://sqlite.org/lang_transaction.html ::任何更改数据库(基本上,除SELECT之外的任何SQL命令)的命令将自动启动一个事务,如果还没有影响。 – bryanmac 2012-02-28 04:55:49

1

尝试打印出你的价值在查询之前确保你获得w你期望的帽子。

另外,经常打开和关闭数据库并不是一个好主意 - 只需打开它并将其分配给实例中的ivar,然后在dealloc(或者真的需要关闭它)时关闭它。

-gus(编写fmdb的人)

+0

谢谢@ccgus,我打印的价值观,他们是正确的。另外,我将在程序运行时每次开启和关闭一次 - 感谢您的提示(并感谢FMON(和橡子)的TON)! – rick 2012-02-28 14:34:28