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 aSQLiteDatabase
that can be reused. The statement cannot return multiple rows, but 1x1 result sets are allowed. Don't use SQLiteStatement constructor directly, please useSQLiteDatabase.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での利用が主なようだ。