2011-06-23 11 views
0

私はデータベースとしてSqlite3を使用するiOSアプリケーションを持っています。 アプリはマルチスレッドです。iOSアプリケーションでsqlite3_busy_timeout()を実装する

私はアプリが別のスレッドからSQLiteのデータ・ロックを取得していないことを確認します。私はsqlite3_busy_timeout()が答えかもしれないと思う。

私の質問はどこにsqlite3_busy_timeout()を配置するのですか?私はappdelegateでsqliteへの接続を開きます。 sqlite3_busy_timeout()をsqlite接続を開いた直後に置くか、データ呼び出しを実行するたびに入力する必要があります。

ご協力いただきありがとうございます。

答えて

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; 
+1

トランザクションは良いですが、SQLite_BUSYエラーを処理する方法のOPの問題別のスレッドがデータベースロックを保持している間にクエリ/文を実行しようとしたときに発生します。 –

2

これはhttp://www.sqlite.org/c3ref/busy_timeout.htmlからである:

「だけで、任意の時点(で)特定のデータベース接続のための単一の忙しいハンドラどんな存在でき、別の忙しいハンドラが呼び出す前に(sqlite3_busy_handler()を使用して)定義されている場合。このルーチンは、他の忙しいハンドラがクリアされます。 "

をですから、『一忙しいハンドラ』は上記の要件に違反することとなる複数のスレッドでデータコールを実行している場合。

私はそれをアプリケーションデリゲートに入れることをお勧めします。

これが役に立ちます。

+0

おかげで、はいそれはありません。もう1つの質問は、データベースがロックされている場合sqlite3は私が何もしないで定義された限りステートメントをexcuteしようとし続けるでしょう – iosdevnyc

関連する問題