【问题标题】:Updating SQLITE query FMDB - Beginner更新 SQLITE 查询 FMDB - 初学者
【发布时间】:2012-08-27 20:14:17
【问题描述】:

我可以从我的 SQLITE DB 中读取数据,但无法更新它。我想知道数据库是否可写。

当我将 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; 
}

【问题讨论】:

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

标签: iphone objective-c fmdb


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多