2013-04-29 68 views
1

我正在爲我的iOS應用使用sqlite數據庫。在這裏,當我嘗試在表格中插入一行時,出現錯誤,說'數據庫已被鎖定'。我同意有許多問題發佈爲相同的和許多解決方案和給出的錯誤的原因,但我沒有解決任何這些。 在sqlite中多線程的原因是被禁止的,數據庫應該是打開的,應該調用finalize等等。我張貼我的代碼以使它更透明。iOS'數據庫中的Sqlite被鎖定'錯誤

插入函數

int open=sqlite3_open([@"/Users/macintosh/Documents/Apps/Project/MyLocal DB/MyLocal.sqlite" UTF8String], &database); 

sqlite3_stmt *statement = NULL; 

const char *sql = "insert into History (MNo,PID, Move,Result,WID, CreatedOn) Values(?, ?, ?, ?, ?, ?)"; 


NSDateFormatter *DateFormatter=[[NSDateFormatter alloc] init]; 
[DateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 


if(open==SQLITE_OK) 
{ 

    if (sqlite3_prepare(database, sql, -1, &statement, NULL) ==SQLITE_OK) 
    { 
     sqlite3_bind_int(statement, 0, mid); 
     sqlite3_bind_int(statement, 1, pid); 
     sqlite3_bind_int(statement, 2, cno); 
     sqlite3_bind_int(statement, 3, result); 
     sqlite3_bind_int(statement, 4, wid); 
     sqlite3_bind_text(statement, 5, [[DateFormatter stringFromDate:[NSDate date]] UTF8String], -1, SQLITE_TRANSIENT); 



     if (sqlite3_step(statement)==SQLITE_DONE) 
     { 
      NSLog(@"inserted the values in table"); 

     } 
     else 
     { 
      NSLog(@" not inserted the values in table"); 
      NSLog(@"error: %s", sqlite3_errmsg(database)); 
     } 
     sqlite3_finalize(statement); 



    } 
    else 
    { 
     NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(database)); 
    } 
    sqlite3_close(database); 
    NSLog(@"db closed"); 
} 
else 
{ 
    NSLog(@"An error has occured: %s",sqlite3_errmsg(database)); 
} 

注:我已經使用了相同的功能,在很多地方插入一行,而且運作良好。我現在得到了這個錯誤,並且確保在運行這個語句時沒有其他語句在同一個數據庫上運行。

回答

4

我想你忘記了在任何地方,這就是爲什麼你

+0

好的我同意這個答案,因此我已經保持NSLog下面每個打開和關閉數據庫語句,然後我改變了它的位置,並將其移動到另一個可寫位置(它以前也位於可寫位置).i重新啓動我的Mac,但我仍然在那裏。它仍然顯示鎖定。我檢查了我的NSLog語句,數據庫無處開放Divz。 Thanx – xrnd 2013-04-29 09:36:26

+2

嗨嗨,我剛剛發現我的錯誤。在我從db返回的函數之一中,沒有調用finalize和close聲明..幫助 – xrnd 2013-04-29 10:41:02

+0

欣賞編碼:) – 2013-04-29 11:15:49

2

經常收到此錯誤,關閉該數據庫,當你得到這樣那樣的錯誤,你必須在你的應用程序parallell進程試圖在同一訪問同一個數據庫時間。如果是這樣的話,儘量把:

sqlite3_busy_timeout(database, 500); 

的地方,並sqlite3_prepare在你的代碼之間sqlite3_open

然後,數據庫連接將在500毫秒內嘗試讀取/寫入,然後放棄,這通常有足夠的時間來轉義鎖定。

1

有兩個原因:

  1. 你可能已經忘記了查詢執行後關閉數據庫。每次執行後都需要關閉數據庫。
  2. 您可能正在同時執行多個查詢。如果您同時執行多個查詢,則必須在多個查詢執行之間放置一些延遲。
+0

您可能正在同時執行多個查詢。如果您同時執行多個查詢,則必須在多個查詢執行之間放置一些延遲。如何在兩個查詢之間添加延遲 – 2017-09-06 08:47:24