До сих пор все мои обращения к базе данных читались, но теперь мне нужно обновить (и после этой вставки)
У меня есть база данных, содержащая «show» в каталоге приложения (только для чтения), и этохорошо для меня (я не хочу копировать его в папку с документами, поскольку он довольно большой, и мне не нужно ничего менять в нем.
Но я хочу, чтобы пользователь выбрал некоторые шоу в качестве своих любимыхПоэтому я создал базу данных с таблицей «favour_shows» в папке документов. Он содержит 4 поля: ID (первичный ключ) show_id is_favorite примечания (в настоящее время еще не используется)
Пользователь может переключатьСтатус is_favorite ОДНАЖДЫ, после этого я получаю сообщение об ошибке при попытке обновить:
SQLITE_BUSY 5 / * Файл базы данных заблокирован * /
Это мой код:
if (sqlite3_open([databasePath UTF8String],&database) == SQLITE_OK){
sqlStatement = "select * from favorite_shows WHERE (show_id = ?)";
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
sqlite3_bind_int(compiledStatement, 1, self.ID);
// search for a show
if(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// if we can find one, toggle the status
favID = sqlite3_column_int(compiledStatement, 0); // we need the primary key to update it
isFav = (sqlite3_column_int(compiledStatement, 2) == 1); // let's store the favorite status
sqlStatement = "update favorite_shows SET is_favorite = ? WHERE (ID = ?)";
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
sqlite3_bind_int(compiledStatement, 1, !isFav );
sqlite3_bind_int(compiledStatement, 2, favID);
int error = sqlite3_step(compiledStatement);
if (SQLITE_DONE != error) {
NSLog(@"error while updating favorite status");
}
}
}
//else : no records found indicating that this show hasn't been a favorite yet, so insert one as favorite
sqlite3_finalize(compiledStatement);
sqlite3_close(database);
}
В чем причина того, что он блокируется во второй раз? Есть ли какие-то другие инструкции, кроме: sqlite3_finalize (compiledStatement);
sqlite3_close (база данных); чтобы закрыть все?