Так что я работаю над этим проектом в течение короткого времени. У меня нет проблем с чтением данных из БД и форматированием их в UITableViews, а что нет. Но теперь я хочу также написать в БД. Проблема в том, что я получаю ошибку «База данных заблокирована» из sqlite. После того, как я возился с оригинальной версией, у меня был момент, когда я понял, что моя база данных находится в комплекте и, следовательно, недоступна для записи. Поэтому я переместил БД в папку «Документы приложений», в которую можно записывать. Но теперь я все еще получаю ту же ошибку «База данных заблокирована» sql. Я открываю и закрываю БД только при необходимости. И, насколько я могу судить, я нигде не оставляю это открытым. Ниже приведен код, где я хочу сделать обновления. Есть мысли?
- (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;
}