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を利用することもできます。