Обновление SQLITE-запроса FMDB - для начинающих - PullRequest
1 голос
/ 30 марта 2012

Я мог читать из моей БД SQLITE, но не смог ее обновить.Интересно, если база данных доступна для записи.

Когда я копирую SQL в консоль SQL, код успешно выполняется.Так что с SQL проблем нет.

-(BOOL) updateScores{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"uniques.sqlite"];

    FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath];
    BOOL success;

    if ([db open]) {

        if ([db hadError]) {
            NSLog(@"DB Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);
        } 

        success = [db executeUpdate:[NSString stringWithFormat:@"UPDATE Score SET answer='11' WHERE name LIKE 'jack'"]];

        if (success) {
            NSLog(@"OK");
        }else {
            NSLog(@"FAIL");
        }

        [db close];
    }else {
        NSLog(@"Problem with DB");
    }

    return success; 
}

1 Ответ

4 голосов
/ 27 августа 2012

Всегда передавайте аргументы в SQL-запрос как тип объекта, пожалуйста, посмотрите, как аргументы передаются в SQL-запрос.Даже если вы передаете число, передайте его как

[NSNumber numberWithInt:someValue] 

Попробуйте:

-(BOOL) updateScores
{
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0]; 
  NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"uniques.sqlite"];

  FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath];
  BOOL success = NO;

  if ([db open] != YES) {
        NSLog(@"DB Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);
        return NO; //VERY IMPORTANT
    } 

  [db beginTransaction];
    success = [db executeUpdate:@"UPDATE scores SET answer = ? WHERE name like ?", @"1", @"jack"]; 

    if (success) {
        NSLog(@"OK");
        [db commit];
        [db close];
    }else {
        NSLog(@"FAIL");
    }

   return success; 
}
...