我正在开发一个使用 sqlite 数据库的 iPhone 应用程序。该应用程序在后台线程中从 Internet 下载数据,而 UI 在主线程中。后台下载线程可以对数据库执行INSERT、UPDATE和SELECT。 UI 层还可以通过执行 UPDATE 和 SELECT 与数据库交互。如果我在后台线程下载时不与 UI 进行大量交互,则一切正常。但是,当下载过程中在主(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 上退出。我尝试将这些语句放入循环中,如果未返回 OK,则重试,但这也不起作用:
int returnCode = 0;
do{
returnCode = sqlite3_step(statement);
if(returnCode != SQLITE_DONE){
usleep(20);
}
}while(returnCode != SQLITE_DONE);
我也尝试过 SQL 事务,但这没有任何区别。我该如何解决这个问题?这似乎是一个相当基本的并发问题,但我还没有看到任何对我有用的东西。
感谢大家的帮助,
贾斯汀