我有一个使用Sqlite3作为数据库的iOS应用程序。 该应用程序是多线程的。
我想确保应用程序不会从一个线程到另一个线程获取SQlite数据锁。我认为sqlite3_busy_timeout()可能就是答案。
我的问题是我在哪里放sqlite3_busy_timeout()?我在appdelegate中打开了与sqlite的连接。我应该在打开sqlite连接后立即放入sqlite3_busy_timeout(),还是每次执行数据调用时都需要输入。
感谢您的帮助。
答案 0 :(得分:3)
这是http://www.sqlite.org/c3ref/busy_timeout.html:
“在任何给定时刻,任何(at)任何特定数据库连接都只能有一个忙处理程序。如果在调用此例程之前定义了另一个忙处理程序(使用sqlite3_busy_handler()),则清除另一个忙处理程序。 “
因此,如果您在多个线程中执行数据调用,则会违反“单个繁忙处理程序”的上述要求。
我建议把它放在app delegate中。
希望这会有所帮助。
答案 1 :(得分:0)
为什么不使用交易呢?这将确保表插入以原子方式完成。
BEGIN TRANSACTION;
INSERT INTO "t1" VALUES(1, 'This is sample data', 3, NULL);
INSERT INTO "t1" VALUES(2, 'More sample data', 6, NULL);
INSERT INTO "t1" VALUES(3, 'And a little more', 9, NULL);
COMMIT;