2009-10-31 3 views
0

그래서이 프로젝트를 잠깐 동안 진행해 왔습니다. DB에서 데이터를 읽고 UITableViews로 포맷하는 데 아무런 문제가 없습니다. 하지만 지금은 DB에 글을 쓰고 싶습니다. 문제는 sqlite에서 "Database is Locked"오류가 계속 발생하는 것입니다. 원래 버전으로 어지러운 후에 나는 데이터베이스가 번들에 있다는 것을 깨닫게되었고, 따라서 쓸모가 없었습니다. 그래서 필자는 DB를 쓰기가 가능한 Apps Documents 폴더로 재배치했습니다. 하지만 지금은 여전히 ​​"데이터베이스 잠김"SQL 오류가 발생합니다. 필요한 경우에만 DB를 열고 닫습니다. 그리고 제가 말할 수있는 한, 나는 어디에서나 열어 두지 않습니다. 아래 코드는 내가 업데이트를하고 싶습니다. 이견있는 사람?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

응용 프로그램 번들 또는 문서 디렉토리의 DB는 어디에 있습니까? – zaph

답변

0

앱을 시작할 때 데이터베이스를 한 번 연 다음 AppDelegate의 applicationWillTerminate에서 닫습니다.

매번 실행 후 재설정을 수행하여 연결 상태를 지우고 싶을 것입니다.

SQLiteBooks 샘플 앱을 살펴보면이 방법으로 코딩되어 있습니다.

0

번들에서 DB를 문서 폴더로 어떻게 이동합니까? 거기에 있는지 확인하고 복사하지 않으면 확인해야합니다. 나는 당신이 그것을 다른 방법으로 복사했지만 읽기 전용 속성을 유지했거나 여전히 번들의 원본을 참조하고 있다는 느낌을 갖습니다.

세부

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

를 참조하거나 joshperry 말하는대로 SQLiteBooks 샘플은 당신이 필요로하는 모든 코드가 들어.

0

어떻게 대출받을 수 있습니까? 데이터베이스가 열려 있고 loanBookTo를 호출하면 열린 오류가 발생하지 않지만 데이터베이스는 사용자가 있던 곳의 상태를 보유합니다.

또한 데이터베이스는 응용 프로그램을 닫거나 종료 할 때 잠긴 상태를 유지하므로 이전 오류에서 잠긴 상태를 '상속'할 수 있습니다. 시뮬레이터에서 앱을 삭제하면 깨끗한 사본을 얻을 수 있습니다.

관련 문제