代码之家  ›  专栏  ›  技术社区  ›  squeezemylime

无法从SQLite数据库中删除行,但未发出错误

  •  1
  • squeezemylime  · 技术社区  · 15 年前

    根据我的Xcode调试器,我使用的是从项目中的表中删除行的正确语法。但是,当我回去检查我的数据库时,它仍然存在。我用于插入条目的其他SQL语法是正确的,所以我不确定我做错了什么。NSLogs确认两个变量都被正确发送:

        -(void) deleteSelectedRowFromTable: (NSString *) tableName cityName:(NSString *)city 
    {
    
    [self openDB];
    NSString *sqlStr = [NSString stringWithFormat:@"DELETE FROM %@ WHERE city LIKE %@", tableName, city];
    const char *sql = [sqlStr UTF8String];
    sqlite3_stmt *statement;
    
    if (sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK) {
        NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(db));
    }
    
    sqlite3_finalize(statement);
    sqlite3_close(db);
    
    }
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Swapna    15 年前

    试试这个说法

    NSString*sqlStr=[NSString stringWithFormat:@“从“%@”中删除,其中city为“%@%”,tableName,city];

        2
  •  1
  •   jon    15 年前

    检查要喜欢的操作数是否为字符串(应在其周围加上引号)。我从来没有用过XCode,但是如果你把第5行改为:

    NSString *sqlStr = [NSString stringWithFormat:@"DELETE FROM %@ WHERE city LIKE '%@'", tableName, city];
    

    这样行吗?

        3
  •  0
  •   KingofHeaven    15 年前

    你刚刚准备好声明,你应该单步声明。

    -(void) deleteSelectedRowFromTable: (NSString *) tableName cityName:(NSString *)city 
    {
    
    [self openDB];
    NSString *sqlStr = [NSString stringWithFormat:@"DELETE FROM %@ WHERE city LIKE %@", tableName, city];
    const char *sql = [sqlStr UTF8String];
    sqlite3_stmt *statement;
    
    if (sqlite3_prepare_v2(db, sql, -1, &statement, nil) != SQLITE_OK) 
    {
          /**this one will execute when there is error in your query**/
        NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(db));
    }
    else
    {
         /************just add this one****************/
         sqlite3_step(statement);
    }
    
    sqlite3_finalize(statement);
    sqlite3_close(db);
    
    }
    

    我希望这个能帮助你。