2015-10-26 49 views
0
-(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); 
} 

使用上面的代码试图触发插入查询,但有时它的工作原理和大部分时间我得到DB锁定错误。Sqlite DB锁定

对于帮助双手提前致谢。

+0

我没有看到一个SQL语句。 – trojanfoe

+0

当您忘记清理某些语句或连接时会发生此错误。这段代码看起来不错;错误是在别的地方。 –

+0

这不是真的好。每次执行语句时打开数据库非常昂贵。这也可能是这个问题的根本原因,因为OP没有正确管理连接。 – trojanfoe

回答

0

您没有正确关闭连接。

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); 
} 
+0

即使做了同样的事情后,相同的情况持续 – vje1998

0

数据库锁定通常发生在向数据库写入内容或者已经打开其他连接时发生。检查你的其他代码丢失连接。

尝试检查sqlite3_prepare_v2的SQLITE_OK,因为数据库可能很忙,并可能为步骤语句返回SQLITE_BUSY。进一步解释here。试试下面的代码:

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

    const char *sql = [query UTF8String]; 
    if(sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL)==SQLITE_OK) 
    { 
     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); 
}