2012-02-28 71 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