#ios #iphone #sqlite #ipad
#iOS #iPhone #sqlite #iPad
Вопрос:
Я создал небольшой инструмент обновления базы данных для обновления наших таблиц базы данных sqlite на основе PRAGMA user_version. Он работал хорошо до недавнего времени, пока мне не понадобилось полностью удалить таблицу.
очевидно, что команда удаления таблицы
DROP TABLE tbl;
Инструкции sql выполняются с использованием:
NSString *currentUpdateStatement = [upgradeStatements objectAtIndex:statementNumber];
DLog(@"Update statement is: %@", currentUpdateStatement);
const char *sql_stmt = [currentUpdateStatement UTF8String];
char *errMsg;
//Start executing the upgrade command
if (sqlite3_exec(self.database, sql_stmt, NULL, NULL, amp;errMsg) == SQLITE_OK)
{
DLog(@"Upgrade statement %i successful", statementNumber);
} else {
NSString *errorMessage = [NSString stringWithUTF8String:errMsg];
ELog(@"Upgrading failed at statement %i in version %i. Message: %@",
statementNumber, newVersionNumber, errorMessage);
[NSException raise:@"Database upgrade failed"
format:@"Database could not be upgraded to version %i. "
"Failed at command %i due to error '%@'",newVersionNumber, statementNumber, errorMessage];
}
Каждый раз, когда я пытаюсь запустить команду удаления таблицы, выполнение завершается с ошибкой «база данных заблокирована» с результатом SQLITE_LOCKED.
Все остальные команды работают нормально. Я пытался снова и снова читать документацию по SQL, но безуспешно. Что вы, ребята, думаете?
Комментарии:
1. Какое-то другое соединение с базой данных имеет активную транзакцию.
2. @CL база данных используется только 1 экземпляром в приложении, и она возвращается только после завершения обновления базы данных, поэтому другой активной транзакции быть не может.
3. Не имеет значения, что вы предполагаете; база данных считает, что есть другая транзакция.
4. @hishamaus вы нашли решение для этого. У меня такая же проблема.
Ответ №1:
Отсутствие sqlite3_finalize (инструкции) после предыдущей транзакции может вызвать эту ошибку.
Комментарии:
1. согласно документам SQLite3, sqlite3_exec — это оператор-оболочка, который выполняет sqlite3_prepare_v2(), sqlite3_step() и sqlite3_finalize(), я предполагаю, что мне не нужно вызывать finalize .
2. @hishamaus Ты используешь
sqlite3_exec
для всего?3. @CL на самом деле только начал использовать его с приведенным выше кодом. Я попробовал как обычный этап подготовки finalize, так и этот, оба не сработали. Следует отметить одну вещь: команды удаления будут работать нормально, если таблица не была затронута (если записи были ранее вставлены и удалены, считайте, что они были затронуты).