【问题标题】:Delete row from SQLLite database从 SQLite 数据库中删除行
【发布时间】:2014-02-03 00:39:22
【问题描述】:

我试图从我的数据库“下面提到的代码”中删除一行,但是它永远不会删除该行,并且似乎也永远不会调用 prepare 语句。

我可以插入和更新,但我这辈子都想不通..

barcode 是从可编辑的表格视图传递给方法的字符串变量。

当我记录 deletSQL 字符串时,我可以看到正确的值,但实际上从未删除记录。

有关更多信息,数据库中的条形码是主键。

此外,数据库路径都是正确的,并且它调用了正确的 db 文件。

只是删除功能不起作用...

-(void)delete:(NSString *)barcode{

const char *dbpath = [databasePath3 UTF8String];
if (sqlite3_open(dbpath, &database3) == SQLITE_OK)
{

    NSLog(@"Opened OK");

NSString *deleteSQL = [NSString stringWithFormat: @"delete from assets where assetBarcode=\"%@\'",barcode];
NSLog(@"%@",deleteSQL);
const char *sql = [deleteSQL UTF8String];

if(sqlite3_prepare_v2(database3, sql, 1, &deleteStatement, NULL) == SQLITE_OK)
{

    NSLog(@"SQL OK?");

    if (sqlite3_step(deleteStatement) == SQLITE_ROW)
    {

        sqlite3_bind_text(deleteStatement, 1, [barcode UTF8String], -1, SQLITE_TRANSIENT);

    }

}

else{

    NSLog(@"WHAAAATTTTT");
}

}

sqlite3_step(deleteStatement);
sqlite3_reset(deleteStatement);
sqlite3_close(database3);

}

【问题讨论】:

  • 为什么要使用 sqlite3_reset 语句?下面的示例删除行代码。 sqlretVal = sqlite3_prepare_v2(dbConnection, insert_stmt, -1, &statement, NULL); if(sqlretVal == SQLITE_OK) { if(sqlite3_step(statement) == SQLITE_DONE) { retVal = 删除记录; } else { retVal = 记录未删除; } } 其他 { retVal = sqlretVal; } sqlite3_finalize(语句); sqlite3_close(dbConnection);

标签: ios database sqlite sql-delete


【解决方案1】:

数据库中的条形码列似乎是 varchar 类型

试试这个

-(void)delete:(NSString *)条码
{

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
{
    if(deleteStatement == nil)
    {
        const char *sql = "DELETE FROM assets WHERE assetBarcode = ?";
        if(sqlite3_prepare_v2(database, sql, -1, & deleteStatement, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(deleteStatement, 1, [barcode UTF8String], -1, SQLITE_TRANSIENT);

    if(SQLITE_DONE != sqlite3_step(deleteStatement))
        NSAssert1(0, @"Error while deleting data. '%s'", sqlite3_errmsg(database));
    else
        //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
        //noteID = sqlite3_last_insert_rowid(database);

        //Reset the delete statement.
        sqlite3_reset(deleteStatement);
    sqlite3_close(database);
    deleteStatement = nil;
}   
else
    sqlite3_close(database); 

}

【讨论】:

    【解决方案2】:

    关于 SQL 字符串...

    delete from assets where assetBarcode=\"%@\'
    

    参数以引号打开并以单引号关闭。两者都使用双引号或单引号。也许这与您的问题有关?

    【讨论】:

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