1

私の質問は、SQLiteDatabase.compileStatement で作成されたプリコンパイル済み SQL ステートメントに関するものです。私が最初に見たすべての例では、プリコンパイルがあり、次のパラメーターが追加され、次にステートメントが実行されます。

ただし、プリコンパイルされたステートメントを最初のどこかで一度プリコンパイルし、次に以前にプリコンパイルされたステートメントを何度も使用して新しいパラメーターを与えるだけであれば、プリコンパイルされたステートメントを使用することは理にかなっているという印象があります。

したがって、質問。それらのステートメントをプリコンパイルする場所 (いつ、どのクラスのどのメソッド) と、次にどのように実行するかという、良い習慣はありますか。

私はSQLiteOpenHelperクラスを拡張することについて疑問に思っていました(実際、onCreateおよびonUpdateメソッドをカバーするために常に拡張する必要があります)、コンストラクター内のすべてのSQLステートメントの最初のプリコンパイルに追加し、次にデータベースへのアクセスを保証する独自のメソッドを作成します(= パラメータをバインドし、次にステートメントを実行します)。

それは良いアプローチですか?もしそうなら、良い習慣は何ですか?

4

1 に答える 1

0

状況を明確にするために、例:

public class MySQLStatements

SQLiteDatabase db;
SQLiteStatement recordInsert;

public SQLDatabaseAndroid (SQLiteDatabase db){
    this.db=db;
}

public void tableCreateExecute () {
    db.execSQL ("CREATE TABLE....");
}

public long recordInsertExecute (par1, par2 etc....) {

    // let's precompile sql statement if it hasn't been previously used
    recordInsert = (recordInsert == null) ? 
                recordInsert = db.compileStatement(recordInsert()) : recordInsert;

    and next sql part.

上記の部分は完全に正しい Java コードではありませんが、私が達成したいことの良い例を示していると思います。単純な sql ステートメントは、初めて使用するときにのみプリコンパイルされます。次に、将来の使用のために保持されます。

問題は、そのような解決策についてどう考えているかです。

また、いつMySQLStatementsオブジェクトを作成できますか? 最後に行うこととして、SQLiteOpenHelper から派生したクラスのコンストラクターで実行できますか? しかし、getWritableDatabase メソッドで db を取得しても安全です。メソッドonCreate、onUpdateで、指定されたdbパラメーターをスキップして、以前にコンストラクターで取得した(getWritableDatabaseによって)使用できますか?

于 2013-09-14T20:31:17.153 に答える