заблокированный файл sqlite на iPhone - PullRequest
1 голос
/ 14 сентября 2010

До сих пор все мои обращения к базе данных читались, но теперь мне нужно обновить (и после этой вставки)

У меня есть база данных, содержащая «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 (база данных); чтобы закрыть все?

1 Ответ

8 голосов
/ 14 сентября 2010

РЕДАКТИРОВАТЬ:

BUSY - это результат повторного использования compiledStatement без удаления ранее скомпилированной статистики. Вам необходимо правильно освободить ресурсы, используя функции завершения и закрытия. Обратитесь к документации здесь. http://sqlite.org/c3ref/stmt.html

const char * select = "select * from favorite_shows WHERE (show_id = ?)";
const char * update = "update favorite_shows SET is_favorite = ? WHERE (ID = ?)";

sqlite3_stmt *selectStmt;
sqlite3_stmt *updateStmt;


if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    if(sqlite3_prepare_v2(database, select, -1, &selectStmt, NULL) == SQLITE_OK) {
        sqlite3_bind_int(selectStmt, 1, self.ID);
        // search for a show
        if(sqlite3_step(selectStmt) == SQLITE_ROW) {
            // if we can find one, toggle the status
            favID       = sqlite3_column_int(selectStmt, 0); // we need the primary key to update it
            isFav       = (sqlite3_column_int(selectStmt, 2) == 1) ? 0 : 1; // Flip is_favorite value
            sqlite3_finalize(selectStmt); // Delete the statement OR create a new one

            if(sqlite3_prepare_v2(database, update, -1, &updateStmt, NULL) == SQLITE_OK) {
                sqlite3_bind_int(updateStmt, 1, isFav );                
                sqlite3_bind_int(updateStmt, 2, favID);
                int error = sqlite3_step(updateStmt);
                if (SQLITE_DONE != error) {
                    NSLog(@"error while updating favorite status");
                } else {
                sqlite3_finalize(updateStmt);
                }
            }
    } //else :  no records found indicating that this show hasn't been a favorite yet, so insert one as favorite
 }
    sqlite3_close(database);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...