在iOS应用中实现sqlite3_busy_timeout()

时间:2011-06-23 14:01:39

标签: ios sqlite

我有一个使用Sqlite3作为数据库的iOS应用程序。 该应用程序是多线程的。

我想确保应用程序不会从一个线程到另一个线程获取SQlite数据锁。我认为sqlite3_busy_timeout()可能就是答案。

我的问题是我在哪里放sqlite3_busy_timeout()?我在appdelegate中打开了与sqlite的连接。我应该在打开sqlite连接后立即放入sqlite3_busy_timeout(),还是每次执行数据调用时都需要输入。

感谢您的帮助。

2 个答案:

答案 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;