2012-02-17 19 views
-1

私はAndroidアプリケーション用のSQLiteを使っています。いくつかの研究の後、私はUNION文を使って複数の挿入トランザクションを実行する方法を理解しました。SQLite複数挿入問題

しかし、これは非常に非効率的です。 http://www.sqlite.org/speed.htmlと他の多くのフォーラムでは、BEGIN-COMMITステートメントを使用して処理を高速化できます。しかし、私はそれらを使用すると、私はこのエラーが表示されます:

Cannot start a transaction within a transaction.

なぜですか?複数の挿入を行う最も効率的な方法は何ですか?

+0

それがあなたを助けるかどうかを確認するhttp://stackoverflow.com/a/8027788/1007273 – hovanessyan

答えて

0

どのJDBCドライバを使用していますか? Androidディストリビューションに組み込まれているのは1つだけですか?

問題はおそらくjava.sql.Connection#setAutoCommit()と思われます。接続がすでに自動コミットが有効になっている場合Connection#getAutoCommit() —で確認できます。手動で行う前に、JDBCドライバがSQLコマンドを発行して手動でトランザクションを開始しているため、手動コマンドが重複して無効になります。

あなたがトランザクション範囲を制御するために探しているなら、あなたは、あなたの個々のDML文がすべて発行された後、

connection.setAutoCommit(false); 

し、後で呼び出すことによってConnectionため自動コミットモードを無効にする必要がありますアクティブトランザクションをコミットまたはロールバックするには、Connection#commit()またはConnection#rollback()を使用します。

一部のJDBCドライバでは、モードの自動コミットと、バッチ関連の方法PreparedStatementがあります。特に、the Xerial JDBC driverthe Zentus driverは、自動コミットモードを制御するユーザとバッチステートメント実行の両方に基づいています。