ですから、私はこのプロジェクトに少しの間取り組んできました。DBからデータを読み取り、それをUITableViewsにフォーマットすることに問題はありません。しかし、今はDBにも書き込みたいと思っています。問題は、sqliteから「データベースがロックされています」というエラーが発生し続けることです。元のバージョンをいじった後、データベースがバンドルに含まれているため、書き込み可能ではないことに気づき、顔をしかめる瞬間がありました。そこで、DBを書き込み可能なAppsDocumentsフォルダーに移動しました。しかし、今でも同じ「データベースがロックされています」というSQLエラーが発生します。必要な場合にのみDBを開いたり閉じたりします。そして、私が知る限り、私はそれをどこにも開いたままにしないでください。以下は私が更新したいコードです。何かご意見は?
- (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;
}