SQLiteDatabaseオブジェクトを使い、SQL文を実行するにはexecSQL()を使用します。
execSQL()は結果を返すことができないため、SELECT文を使用したデータの取得はできませんが、結果を必要としないSQLであればどのようなSQL文でも実行することが可能です。
シグネチャは以下の2つです。
public void execSQL (String sql) public void execSQL (String sql, Object[] bindArgs)
1つ目のメソッドは、引数にSQLをそのまま渡すことができます。
2つ目のメソッドは、第1引数のSQL中で「?」とした箇所に第2引数の値をあてはめる(バインドする)ことができます。
実行例です。
MyOpenHelper helper = new MyOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL(
"CREATE TABLE person(" +
" name TEXT NOT NULL," +
" age INTEGER " +
");"
);
db.execSQL("INSERT INTO person(name,age) VALUES ('佐藤 一郎', 24);");
db.execSQL("INSERT INTO person(name,age) VALUES (?, ?);",new Object[]{"鈴木 二郎",18});
実行結果イメージです。
|
name |
age |
| 佐藤 一郎 | 24 |
| 鈴木 二郎 | 18 |
注意しなくてはいけない点は、このexecSQL()メソッドは戻り値を返さないということです。
このメソッドで実行するのに適したSQLは以下となります。
- ALTER TABLE
- CREATE table / trigger / view / index / virtual table
- DROP table / trigger / view / index / virtual table
- REINDEX
- RELEASE
- SAVEPOINT
上記例では、INSERT文を実行していますが、戻り値がないためにINSERTに成功したかどうか判別する方法がありません。
同じ理由で、UPDATE文やDELETE文を実行するメソッドとしても適切とはいえないでしょう。(もちろんSELECT文は言うまでもありません。)
|
SQL |
推奨されるメソッド |
| ALTER文/CREATE文/DROP文など | execSQL() |
| SELECT文 | query() rawQuery() queryWithFactory() rawQueryWithFactory() |
| INSERT文 | insert() insertOrThrow() insertWithOnConflict() |
| UPDATE文 | update() updateWithOnConflict() |
| DELETE文 | delete() |
また、AndroidのSQLiteでは、JDBCでおなじみのPreparedStatementを利用することもできます。