Iphone 更新SQLITE查询FMDB-初学者

Iphone 更新SQLITE查询FMDB-初学者,iphone,objective-c,fmdb,Iphone,Objective C,Fmdb,我可以读取SQLITE数据库,但无法更新它。我想知道数据库是否可写 当我将SQL复制到SQL控制台时,代码将成功执行。所以SQL没有问题 -(BOOL) updateScores{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0

我可以读取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; 
}

始终将参数作为对象类型传递给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; 
}

始终将参数作为对象类型传递给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; 
}

它在控制台中打印什么?OK-FAIL-DB有问题吗?它说OK,但当我在控制台中键入select*SQL时,它还没有更新。如果你没有在其中放入任何变量,为什么要使用stringWithFormat?尝试文字,如果它不起作用,请删除单引号。它仍然不起作用。实际上,我得到的状态是OK,这意味着查询执行成功。但当我在sqlite终端中交叉检查时,它还没有更新。帮助1:尝试在模拟器中启动应用程序,并检查是否已在文件系统输出writableDBPath上创建uniques.sqlite文件。我对此表示怀疑。2:永远不要使用stringWithFormat执行查询。而是使用FMDB提供的解决方案。3:可能是因为您试图更新一个空的sqlite3数据库?在哪里执行DDL?它在控制台中打印什么?OK-FAIL-DB有问题吗?它说OK,但当我在控制台中键入select*SQL时,它还没有更新。如果你没有在其中放入任何变量,为什么要使用stringWithFormat?尝试文字,如果它不起作用,请删除单引号。它仍然不起作用。实际上,我得到的状态是OK,这意味着查询执行成功。但当我在sqlite终端中交叉检查时,它还没有更新。帮助1:尝试在模拟器中启动应用程序,并检查是否已在文件系统输出writableDBPath上创建uniques.sqlite文件。我对此表示怀疑。2:永远不要使用stringWithFormat执行查询。而是使用FMDB提供的解决方案。3:可能是因为您试图更新一个空的sqlite3数据库?在哪里执行DDL?