6

SQLiteStatementSQLiteトランザクションの最適化にトランザクションでコンパイルされたものを使用していますが、execute関数のドキュメントを読んでいます:

SELECT / INSERT / DELETE / UPDATEでない場合は、このSQLステートメントを実行します(CREATE / DROPテーブル、ビュー、トリガー、インデックスなど)。

SELECT / INSERT / DELETE / UPDATEこれは、この関数をステートメントで使用してはならないことを意味しているようですが、挿入で使用して機能するコードがあります。

私はexecuteInsert他の方法を知ってexecuteUpdateDeleteいますが、私のAPIレベルでは利用できないので、使用できますexecuteか?

また、最後の挿入IDや影響を受ける行数が必要ない場合は、 andなどexecuteの代わりに使用する必要があります。つまり、より効率的ですか。executeInsert

4

2 に答える 2

3

executeおそらくより速くはなくexecuteInsert、さらに遅くなる可能性があります(ICSexecute呼び出しexecuteUpdateDeleteでは、戻り値を破棄します)。それをテストする必要がありますが、ここで本当の違いが見つかるとは思えません。

AFAIK、execute戻り値が必要ない場合でも安全に使用できますが、将来のAndroidバージョンではそれが当てはまるとは思いません。ドキュメントには「いいえ」と書かれているので、誰かがそれを反映するように動作を変更しようとしている可能性があります。古い実装executeも使用しているようです(例:2.1delete()ソースコード)。たとえば、Jelly BeanはSQLiteの舞台裏で大きく変更されましたが、使用する場合でも機能するはずです。execute

その上、引数を再バインドするだけで同じものを何度も使用しない場合は、SQLiteStatementおそらくそれを使用する価値はありません。insert通常の、、 ...メソッドを呼び出すたびに新しいupdateメソッドを構築することは、実際のデータベースアクセスおよび必要なディスクI/Oと比較して高速です。一方、各ステートメントのディスク上のデータベース状態の同期は非常に遅いため、トランザクションは非常に役立ちます。

于 2012-11-13T17:54:42.817 に答える
1

データベースとの相互作用には、 SQLiteStatementの代わりにSQLiteDatabaseを使用してください。SQLiteStatementsはスレッドセーフではないため、SELECT / INSERT / DELETE/UPDATEには使用しません。また、以外の目的で生のデータベースクエリを使用しないようにする必要がありますSelects。データベースのパフォーマンスを向上させる組み込みのヘルパー関数があります。あなたのインスタンスにSQLiteDatabaseは.insert、.update、.deleteがあり、Selectsには.rawQueryを使用しています。

于 2012-11-13T18:08:16.587 に答える