2015-10-26 50 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); 
}