Удалить строку из базы данных SQLite с помощью FMDB
Я чувствую, что прочитал документы по FMDB миллион раз. Я не уверен, почему этот код не работает - я пробовал метод executeUpdate и executeMethodWithFormat и их соответствующие форматы, похоже, не работают. _dbArray - это массив словарей. эти строки возвращают правильные значения - если я копирую и вставляю результаты и запускаю запрос в терминале, он удаляет запись в порядке. я что-то упускаю очевидное?
- (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 ответа
Ваш идентификатор int?
Если это так, попробуйте передать NSNumber отформатированному оператору обновления.
Этот пост может конвертировать NSString в NSNumber.
Как преобразовать NSString в NSNumber
[db executeUpdate:@"DELETE FROM tbl1 WHERE entry = ?", idNumber];
Вот связанный пост:
Как удалить строку в таблице базы данных sqlite?
Кроме того, убедитесь, что вы проверите на наличие ошибок после ваших заявлений:
NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);
Попробуйте распечатать свои значения перед запросом, чтобы убедиться, что вы получаете то, что ожидаете.
Кроме того, открывать и закрывать вашу базу данных так часто не очень хорошая идея - просто откройте ее один раз и назначьте для ivar в вашем экземпляре, а затем закройте, когда вы откроете (или действительно должны закрыть).
-гус (парень, который написал fmdb)
Попробуйте добавить:
[database beginTransaction];
перед вашим блоком CRUD, и:
[database commit];
после выполнения операции обновления / удаления / вставки. плюс executeUpdate
верно-
[database executeUpdate:sqlStat];