从 sqlite3 数据库中删除某些行

Posted

技术标签:

【中文标题】从 sqlite3 数据库中删除某些行【英文标题】:delete certain rows from sqlite3 database 【发布时间】:2011-11-27 21:52:41 【问题描述】:

我正在尝试从我的数据库中删除创建行。但它没有这样做,所以我的表格中有重复的日期特定内容,所以我想删除特定日期的条目并在每次建立连接时添加它们

我的代码是:

static sqlite3 *database = nil;
static sqlite3_stmt *deleteStmt = nil;

- (NSString *)dataFilePath 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                         NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:@"person.sqlite3"];



    NSDate *today = [NSDate date];
    NSLog(@"%@", today);
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"MM/dd/yy"];

    if (sqlite3_open([[self dataFilePath] UTF8String], &database)
        != SQLITE_OK)
    
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database");
    


    NSString * dateString = [dateFormat stringFromDate:today];
    if(deleteStmt == nil)
    
        const char *sql = "delete from SHOPPER where DATE = ?";
        if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
    

    //When binding parameters, index starts from 1 and not zero.
    sqlite3_bind_text(deleteStmt, 3, [dateString UTF8String],-1, NULL);

    if (SQLITE_DONE != sqlite3_step(deleteStmt))
        NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));

    sqlite3_reset(deleteStmt);

    sqlite3_close(database);

【问题讨论】:

【参考方案1】:

sqlite3_bind_text 的第二个参数应该是 1,而不是 3。 这意味着'?'的索引准备好的语句中的字符,以及 因为只有一个“?”在你的删除语句中,它必须是 1。

//When binding parameters, index starts from 1 and not zero.
sqlite3_bind_text(deleteStmt, 1, [dateString UTF8String], -1, NULL);

那么,为什么要将 deleteStmt 声明为静态,并且只创建一次? 我认为它应该为开放数据库创建,因为你打开 并每次关闭数据库,您应该创建(并完成,而不是重置) 每次都删除Stmt。

【讨论】:

以上是关于从 sqlite3 数据库中删除某些行的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据框列的某些行中删除字符?

如何从 DJango 的 SQLite3 中删除表?

从 sqlite3 数据库上的表单提交中的 sqlalchemy 行更新行为不一致

从 Python 执行 sqlite3 "dot" 命令或在命令行实用程序中注册排序规则

无法从带有意外字符的 sqlite3 文件中检索数据

针对 20,000 多次更新优化 Sqlite3