【问题标题】:Update issue with sqliteManagersqliteManager 的更新问题
【发布时间】:2012-07-18 12:30:53
【问题描述】:

我无法进行更新,但插入和选择工作正常。

注意:

1) 我使用的包装器来自:https://github.com/misato/SQLiteManager4iOS

2) 相同的代码适用于 INSERT 语句,但不适用于更新

//NSString* sqlStr = (@"INSERT INTO sbu (sbuName) VALUES ( 'rrrr' );)"); //WORKS

3) 下面是代码:

本次更新相关代码如下:

我的内联代码

    NSString* sqlStr = (@"UPDATE User SET Name = 'wweerr' WHERE Id = 19"); //using a direct sql to verify if it works - does not
    SQLiteManager* dbManager =[[SQLiteManager alloc]initWithDatabaseNamed:@"data.db"];
    NSError* error = [dbManager doQuery:sqlStr];

来自图书馆:

- (NSError *)doQuery:(NSString *)sql {

    NSError *openError = nil;
    NSError *errorQuery = nil;

    //Check if database is open and ready.
    if (db == nil) {
        openError = [self openDatabase];
    }

    if (openError == nil) {     
        sqlite3_stmt *statement;    
        const char *query = [sql UTF8String];
        sqlite3_prepare_v2(db, query, -1, &statement, NULL);

        if (sqlite3_step(statement) == SQLITE_ERROR) {
            const char *errorMsg = sqlite3_errmsg(db);
            errorQuery = [self createDBErrorWithDescription:[NSString stringWithCString:errorMsg encoding:NSUTF8StringEncoding]
                                                    andCode:kDBErrorQuery];
        }
        //NSLog(@"sql error: %@", error)
        NSInteger result =  sqlite3_finalize(statement);
        errorQuery = [self closeDatabase];
    }
    else {
        errorQuery = openError;
    }

【问题讨论】:

  • 更新的错误是什么? select ... where Id = 18 给出了什么?
  • 嗨,马克,这里奇怪的是没有产生错误:(我还做了一些步骤调试,流程在任何时候都没有停止。我不知道为什么会这样不工作..
  • select * from User where Id = 19 提供了什么
  • 嗨,马克,我发现了陷阱,请参阅下面的答案。另外,如果您对我在这里提出的这个新问题有答案:stackoverflow.com/questions/11547500/…

标签: iphone ios ipad sqlite


【解决方案1】:

我会尝试使用“WHERE Id = '19'”(19 带单引号),因为该字段可能已被定义为文本,因为 sqlite 字段是弱类型的。

【讨论】:

  • 嗨 Shine,我不认为是这种情况,因为当我在 sqlite 管理器上运行这个确切的查询时,它工作正常。我也试过你说的只是为了确保,但仍然不起作用..
【解决方案2】:

我发现了陷阱。 我使用以下方法包装了字符串:initWithFormat.

我只是像这样分配一个变量:

NSString *sqlStr = [[NSString alloc] initWithFormat:@"UPDATE User SET Name = 'some name' WHERE sbuId = 19"];

现在我只是将这个变量传入:

NSError* error = [[Utilities dbManager] doQuery:sqlStr];

TODO/TO_ASK:

为什么同样的事情不适用:

 NSString* sqlStr = [NSString stringWithFormat:@"UPDATE User SET Name = 'some name' WHERE sbuId = 19"];

【讨论】:

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