11/26/2012

Android DatabaseでのSQLiteStatementについて

AndroidのDatabaseを使う際に、SQLiteDatabase.compileStatementメソッドでSQLiteStatementを生成する方法がある。これは、実装上Insert,Update,Replace,Deleteのためのものではなく、あくまでそれ以外の呼び出し、Create/Drop Table, View , Indexを呼び出す際に利用するものとJavaDocに記述されている。

SQLiteStatementのオブジェクトはSynchronaizedなので、他のスレッドと共有でつかうことはできない。また内部のBind処理に関して、利用が終了した時点でClearBindArgsを呼ばないとクリアされないので、その動作が関係しているのではないかと推察する。

またSQLiteStatementを利用しなくても、execSQL(String)と等価であるとあるので、CreateTableでは利用しないし、DropTableでもSQLiteStatementはあまり利用しないとおもわれる。Bindする要素がなく、そのSQLを隠蔽したい場合にのみ使うとかんがえられる。そしてViewの場合に利用することが多くなりそうである。ViewのSQLを作成しておいてBindを行い、利用する局面はありうる。

追記
JavaDocには、COUNT(*)などの場合の呼び出しに使う場合が記述してある。

追記
SQLiteStatementのクラスJavaDocコメントを以下に引用する。

A pre-compiled statement against a SQLiteDatabase that can be reused. The statement cannot return multiple rows, but 1x1 result sets are allowed. Don't use SQLiteStatement constructor directly, please use SQLiteDatabase.compileStatement(String) 
SQLiteStatement is NOT internally synchronized so code using a SQLiteStatement from multiple threads should perform its own synchronization when using the SQLiteStatement.
基本的にはViewとしても使えないと考える。MAX、MINやCOUNTなどの特別なProcedureでの利用が主なようだ。

0 件のコメント:

コメントを投稿