Objective c Sqlite数据库已锁定

Objective c Sqlite数据库已锁定,objective-c,iphone,sqlite,Objective C,Iphone,Sqlite,使用上面的代码试图启动insert查询,但有时它可以工作,而且大多数时候我会收到DB locked错误 感谢您的帮助。您没有正确关闭连接 -(void)insertQuery:(NSString *)query{ sqlite3_stmt *selectstmt; // Create a sqlite object. sqlite3 *database; // Set the database file path. NSString *databasePa

使用上面的代码试图启动insert查询,但有时它可以工作,而且大多数时候我会收到DB locked错误


感谢您的帮助。

您没有正确关闭连接

-(void)insertQuery:(NSString *)query{
    sqlite3_stmt *selectstmt;
    // Create a sqlite object.
    sqlite3 *database;
    // Set the database file path.
    NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];

    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        //*************** insert value in database******************************\\

        const char *sql = [query UTF8String];
        sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL);
        if(sqlite3_step(selectstmt)==SQLITE_DONE)
        {
            NSLog(@"insert successfully");
        }
        else
        {
            NSLog(@"insert not successfully");
            NSLog(@"DB Error: %s", sqlite3_errmsg(database));
        }
        sqlite3_finalize(selectstmt);
    }
    sqlite3_close(database);
}

您没有正确关闭连接

-(void)insertQuery:(NSString *)query{
    sqlite3_stmt *selectstmt;
    // Create a sqlite object.
    sqlite3 *database;
    // Set the database file path.
    NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];

    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        //*************** insert value in database******************************\\

        const char *sql = [query UTF8String];
        sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL);
        if(sqlite3_step(selectstmt)==SQLITE_DONE)
        {
            NSLog(@"insert successfully");
        }
        else
        {
            NSLog(@"insert not successfully");
            NSLog(@"DB Error: %s", sqlite3_errmsg(database));
        }
        sqlite3_finalize(selectstmt);
    }
    sqlite3_close(database);
}

数据库锁定通常发生在您正在向数据库写入某些内容或您保持其他连接打开时。检查其他代码是否丢失连接

尝试检查sqlite3\U prepare\U v2的SQLITE\U OK,因为数据库可能正忙,并且可能会为step语句返回SQLITE\U busy。进一步解释。请尝试以下代码:

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    //*************** insert value in database******************************\\

    const char *sql = [query UTF8String];
    sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL);
    if(sqlite3_step(selectstmt)==SQLITE_DONE)
    {
        NSLog(@"insert successfully");
    }
    else
    {
        NSLog(@"insert not successfully");
        NSLog(@"DB Error: %s", sqlite3_errmsg(database));
    }
    sqlite3_finalize(selectstmt);
    sqlite3_close(database);
}

数据库锁定通常发生在您正在向数据库写入某些内容或您保持其他连接打开时。检查其他代码是否丢失连接

尝试检查sqlite3\U prepare\U v2的SQLITE\U OK,因为数据库可能正忙,并且可能会为step语句返回SQLITE\U busy。进一步解释。请尝试以下代码:

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    //*************** insert value in database******************************\\

    const char *sql = [query UTF8String];
    sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL);
    if(sqlite3_step(selectstmt)==SQLITE_DONE)
    {
        NSLog(@"insert successfully");
    }
    else
    {
        NSLog(@"insert not successfully");
        NSLog(@"DB Error: %s", sqlite3_errmsg(database));
    }
    sqlite3_finalize(selectstmt);
    sqlite3_close(database);
}
使用此链接并使用FMDB管理您的数据库。5个月前我也遇到过这个问题,我用这个解决了100%的问题

      使用此链接并使用FMDB管理您的数据库。5个月前我也遇到过这个问题,我用这个解决了100%的问题


      我没有看到SQL语句。当您忘记清理某些语句或连接时,会发生此错误。这个代码看起来不错;错误在别的地方。它不是很正常。每次执行语句时打开数据库是非常昂贵的。这也可能是这个问题的根本原因,因为OP没有正确管理连接。@trojanfoe嘿,我想说的是任何插入statement@trojanfoe那么,如果你能给我一些我看不到SQL语句的指导,还有什么其他的方法呢?当你忘记清理一些语句或连接时,就会发生这个错误。这个代码看起来不错;错误在别的地方。它不是很正常。每次执行语句时打开数据库是非常昂贵的。这也可能是这个问题的根本原因,因为OP没有正确管理连接。@trojanfoe嘿,我想说的是任何插入statement@trojanfoe那么,如果你能给我一些指导,那么还有什么其他的方法呢?即使你做了同样的事情,同样的情景,同样的情景,即使你做了同样的事情,同样的情景,同样的情景,请接受我的答案如果你的问题在1998年得到解决,请接受我的回答