удалить строку из базы данных SQLite с помощью FMDB - PullRequest
3 голосов
/ 28 февраля 2012

Я чувствую, что прочитал документы по 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 ]

6 голосов
/ 28 февраля 2012

Является ли ваш идентификатор целым?

Если это так, попробуйте передать NSNumber в форматированный оператор обновления.

Этот пост может конвертировать NSString в NSNumber.

Как преобразовать NSString в NSNumber

 [db executeUpdate:@"DELETE FROM tbl1 WHERE entry = ?", idNumber];

Вот связанный пост:

Как удалить строку в таблице базы данных sqlite?

Кроме того, обязательно проверяйте наличие ошибок после своих утверждений:

NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);
2 голосов
/ 28 февраля 2012

Попробуйте распечатать свои значения перед запросом, чтобы убедиться, что вы получаете то, что ожидаете.

Кроме того, открывать и закрывать вашу базу данных так часто не очень хорошая идея - просто откройте ее один раз и назначьте для ivar в вашем экземпляре, а затем закройте, когда вы сделаете Deloc (или действительно должны закрыть ее).

-gus (парень, который написал fmdb)

0 голосов
/ 28 февраля 2012

попробуйте добавить:

[database beginTransaction];

перед вашим блоком CRUD и:

[database commit];

после выполнения операции обновления / удаления / вставки. Плюс executeUpdate правильно-

[database executeUpdate:sqlStat];

...