Я работаю над приложением для iPhone, которое использует базу данных sqlite. Приложение загружает данные из Интернета в фоновом потоке с пользовательским интерфейсом в основном потоке. Поток фоновой загрузки может предварительно выполнить INSERT, UPDATE и SELECT в базе данных. Уровень пользовательского интерфейса также может взаимодействовать с базой данных, выполняя UPDATE и SELECT. Если я не сильно взаимодействую с пользовательским интерфейсом во время загрузки фонового потока, все работает нормально. Однако я начинаю сталкиваться с проблемами, когда во время загрузки выполняется много ОБНОВЛЕНИЙ в основном потоке (UI).
Приложение всегда закрывается, когда оно пытается запустить функцию базы данных. Он завершается с EXC_BAD_ACCESS, и я не вижу никаких ошибок. Например, последний раз, когда он выходил, он заканчивался на sqlite3_step:
sqlite3_stmt *statement;
const char *query = "INSERT OR IGNORE INTO `names` (`id`,`name`) VALUES (?,?);";
if(sqlite3_prepare_v2(database, query, -1, &statement, NULL) != SQLITE_OK){
NSAssert1(0, @"Error while creating insert statement. '%s'", sqlite3_errmsg(database));
return NO;
}
sqlite3_bind_int(statement, 1, id);
sqlite3_bind_text(statement, 2, name, -1, SQLITE_TRANSIENT);
if(sqlite3_step(statement) != SQLITE_DONE)
NSAssert1(0, @"Error while inserting. '%s'", sqlite3_errmsg(database));
sqlite3_finalize(statement);
Он не всегда завершается на sqlite3_step, иногда он завершается на sqlite3_prepare_v2 или sqlite3_exec. Я попытался поместить эти операторы в цикл и попробовать еще раз, если он не возвращает ОК, но это тоже не работает:
int returnCode = 0;
do{
returnCode = sqlite3_step(statement);
if(returnCode != SQLITE_DONE){
usleep(20);
}
}while(returnCode != SQLITE_DONE);
Я также пробовал транзакции SQL, но это не имеет никакого значения. Как я могу решить это? Кажется, это довольно простой вопрос параллелизма, но я не видел ничего, что могло бы помочь мне.
Спасибо за вашу помощь,
Justin