2009-10-31 68 views
0

所以我一直在這個項目上工作了一段時間。我從數據庫讀取數據並將其格式化爲UITableViews並沒有問題。但現在我也想寫入數據庫。問題是我不斷從sqlite中獲取「數據庫已鎖定」錯誤。在完成了原始版本之後,我通過實現我的數據庫處於捆綁狀態並因此不可寫,從而獲得了面部掌紋時刻。因此,我將數據庫重新定位到可以寫入的Apps Documents文件夾。但現在我仍然得到相同的「數據庫被鎖定」sql錯誤。我只在必要時打開和關閉數據庫。據我所知,我不會在任何地方打開它。以下是我想要更新的代碼。有什麼想法嗎?iPhone sqlite3鎖定,只能讀取,不能寫入

- (BOOL) loanBookTo:(NSString *)newborrower{ 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *path = [documentsDirectory stringByAppendingPathComponent:@"books.sqlite"]; 

     if([[NSFileManager defaultManager] fileExistsAtPath:path]){ 
      NSLog(@"File Exists at: %@", path); 
     } 


     if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) { 
      NSString *mySQL = @"UPDATE BOOKS SET LOANED = 1, BORROWER = \"<BORROWER>\" where ISBN = \"<ISBN>\""; 
      mySQL = [mySQL stringByReplacingOccurrencesOfString:@"<ISBN>" withString:self.isbn]; 
      mySQL = [mySQL stringByReplacingOccurrencesOfString:@"<BORROWER>" withString:newborrower]; 
      const char *sql = [mySQL UTF8String]; 
      char* errmsg; 
      sqlite3_exec(database, sql, NULL, NULL, &errmsg); 

      // Q. Database is locked. Why? 
      // A. Because it is in the Bundle and is ReadOnly. 
      // Need to write a copy to the Doc folder. 

      // Database is Locked error gets spit out here. 
      printf(errmsg); 
      sqlite3_close(database); 
     } 
     return NO; 
    } 
+0

數據庫在應用程序包或文檔目錄中位於何處? – zaph 2009-10-31 15:27:50

回答

0

打開你的應用程序的啓動一次數據庫,然後將其關閉在AppDelegate中的applicationWillTerminate。

每次執行完後,您都需要執行重置以清除連接狀態。

看看SQLiteBooks示例應用程序,它是這樣編碼的。

0

如何將數據庫從包中移動到文檔文件夾?你需要檢查它是否在那裏,如果沒有複製它。我感覺你要麼以其他方式複製它,而要保留一個只讀屬性,或者更可能的是,你仍然在引用包中的原始文件。

詳見

Where would you place your SQLite database file in an iPhone app?

或joshperry稱,SQLiteBooks樣品有所有你需要的代碼。

0

你最近怎麼去loanBookTo?如果數據庫處於打開狀態,然後調用loanBookTo,它可能不會拋出open的錯誤,但是數據庫處於您來自哪裏的狀態。

有時,數據庫在關閉和退出應用程序時會保留鎖定狀態,因此您可能會從之前的失敗中「繼承」鎖定狀態。從模擬器中刪除應用程序應該給你一個乾淨的副本。