我正在使用一个使用sqlite数据库的iPhone应用程序.该应用程序在后台线程中使用主线程中的UI下载Internet数据.后台下载线程可以在数据库上执行INSERT,UPDATE和SELECT. UI层还可以通过执行UPDATE和SELECT与数据库交互.如果我在后台线程下载时没有与UI进行大量交互,一切正常.但是,当在下载过程中执行主(UI)线程上的大量UPDATE时,我开始遇到问题.
应用程序在尝试运行数据库功能时始终退出.它退出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,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事务,但这没有任何区别.我怎么解决这个问题?它似乎是一个相当基本的并发问题,但我没有看到任何适合我的东西.
谢谢你的帮助,
贾斯汀
我正在使用Objective-C编写一个几乎完全相同的w.r.t行为的程序.
这是我打算如何同步访问(我问的问题有点无关,但看看代码):
Calling sqlite3_close for a static sqlite3* handle
我将使用静态NSLock实例并在写入时将其锁定,然后在完成后将其解锁.
我不知道对您的应用程序有多大的改变,但它可能是一个解决方案.