SQLiteの使い方/Getting Started
Android開発では、データを保存する方法に『Preferenceを利用する方法』『ファイル出力する方法』『SQLiteを利用する方法』があります。
本エントリーでは、SQLiteを利用する方法を、以下のサンプルを用いて紹介していきます。
■入力画面
EditTextに入力したデータを『Writeボタン押下』のタイミングで保存しています。
『Showボタン押下』にて、入力データを表示する画面に遷移します。
■データの保存
データベースのインスタンス(SQLiteDatabaseクラス)を取得し、SQLiteDatabaseクラスのinsertメソッドを呼び出すことでSQLiteに保存することができます。
■出力画面
データを保存した際にToastにて表示する数値を入力することで、入力データを表示します。
同じく、保存の際の数値を入力し入力データを削除することもできます。
■データの検索
SQLiteに保存したデータの検索は、SQLiteDatabaseクラスのqueryメソッドを利用します。
検索結果はリスト化されたデータを指し示す、Cursorクラスのインスタンスとして取得でき、
Cursorを移動することでデータを取り出す事ができます。
■データの削除
SQLiteに保存したデータの削除は、SQLiteDatabaseクラスのdeleteメソッドを利用します。
紹介する内容は、以下表の内容になります。
SQLiteOpenHelperクラス(表1)
| メソッド名 | 呼び出されるタイミング |
|---|---|
| onCreateメソッド | DBが作成されていない場合に呼び出される |
| onUpgradeメソッド | DBのバージョンが一致しない場合に呼び出される |
| getReadableDatabaseメソッド | 読み込み権限のみのDBを取得する |
| getWritableDatabaseメソッド | 読み書き権限のDBを取得する |
SQLiteDatabaseクラス(表2)
| メソッド名 | 用途 |
|---|---|
| insertメソッド | データを入力する |
| deleteメソッド | データを削除する |
| execSQLメソッド | SQL文を実行する |
| queryメソッド | データを検索する |
それでは続きをどうぞ。
○データベースを開くためのHelperクラスを作成する
Androidには、SQLiteDatabaseを簡単に管理するためのHelperクラスである
SQLiteOpenHelperクラスが準備されています。
SQLiteOpenHelperクラスにはonCreateメソッドとonUpgradeメソッドという2つのabstractメソッドがあり(表1)、これらを使用することでデータベースの管理を簡易に行う事が可能になります。
以下のようにSQLiteOpenHelperクラスを継承したMySQLiteOpenHelperクラスを作成しています。
SQLiteDatabaseクラスのexecSQLメソッドを利用することで、SQL文を実行することができます。
データベース内にテーブルを作成する際には、以下のように指定します。
src/MySQLiteOpenHelper.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public class MySQLiteOpenHelper extends SQLiteOpenHelper { static final String DB_NAME = "sqlite_sample.db"; // DB名 static final int DB_VERSION = 1; // DBのVersion // SQL文をStringに保持しておく static String CREATE_TABLE = null; static final String DROP_TABLE = "drop table mytable;"; // コンストラクタ // CREATE用のSQLを取得する public MySQLiteOpenHelper(Context mContext, String sql){ super(mContext,DB_NAME,null,DB_VERSION); CREATE_TABLE = sql; } public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } // DBが存在しない状態でOpenすると、onCreateがコールされる // 新規作成されたDBのインスタンスが付与されるので、テーブルを作成する。 @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } // コンストラクタで指定したバージョンと、参照先のDBのバージョンに差異があるときにコールされる // 今回バージョンは1固定のため、処理は行わない。 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }} |
SQLiteOpenHelperクラスのgetWritableDatabaseメソッドを呼び出す事で、
SQLiteDatabaseクラスのインスタンスを取得します。
取得したインスタンスより、SQLiteDatabaseクラスのメソッドを利用し、データベースを制御していきます。
src/DBSampleActivity.java
1 2 3 4 5 6 7 8 | private final String CREATE_TABLE_SQL = "CREATE TABLE "+TABLE_NAME+" ( "+FIELD_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+FIELD_DATA+" TEXT NOT NULL );";public void onCreate(Bundle savedInstanceState) { .....省略 // DBの作成 MySQLiteOpenHelper hlpr = new MySQLiteOpenHelper(getApplicationContext(),CREATE_TABLE_SQL); mydb = hlpr.getWritableDatabase();} |
SQL文について
本節では、少し本題から逸れて、簡単なSQL文について紹介していきます。
紹介するSQL文はサンプルでも使用しているCREATE文と、非常に基本的な構文であるSELECT文についてです。
CREATE文はテーブルを作成する場合に使用します。
テーブル内にフィールドを複数持つ場合には、小括弧を使用し、各パラメータを設定します。
また、SELECT文は登録済みのデータから特定データを検索する場合に使用します。
WHERE句等と組み合わせることで、強力な検索が可能となります。
| 要素 | 構文 | 用途 |
|---|---|---|
| CREATE文 | CREATE テーブル名 ( Field名 Param, ...); | テーブルの作成 |
| SELECT文 | SELECT フィールド名,フィールド名,.... FROM テーブル名 WHERE フィールド名='検索データ' ; | テーブルの検索 |
サンプルでのCREATE文のパラメータの指定は、以下表の通りになります。
| テーブル名 | sample_table |
|---|---|
| フィールド1の名前 | _id |
| フィールド1パラメータ | INTEGER型 プライマリKey 自動でインクリメントする |
| フィールド2の名前 | data |
| フィールド2パラメータ | TEXT型 NULLは認めない |
上記表と以下CREATE文を見比べ、構文のイメージをつかみましょう。
_id INTEGER PRIMARY KEY AUTOINCREMENT,
data TEXT NOT NULL );
○データをSQLiteに登録する
SQLiteにデータを保存する際には、表2で纏めたSQLiteDatabaseクラスのinsertメソッドを利用します。
1.ContentValuesクラスを用意し、保存先のデータフィールドと保存データをputメソッドを使ってセットする
2.1で作成したContentValuesクラスのインスタンスを、insertメソッドに渡しデータを保存する
ContentValuesクラスのputメソッド
| 引数 | 型 | 用途 |
|---|---|---|
| 第一引数 | String | フィールド名 |
| 第二引数 | etc..(※) | putするデータ |
※Byte Integer Float Short Byte[] String Double Long Boolean型が指定できる
サンプルでは、EditTextに入力した文字列をWriteボタンが押下された時にデータベースへ保存します。
そのため、onClickメソッドの中でContentValuesクラスのputメソッドの処理を行っています。
1 2 3 4 5 6 7 8 9 10 11 | @Overridepublic void onClick(View v) { switch(v.getId()){ .....省略 case R.id.WriteButton: // データの追加 ContentValues values = new ContentValues(); values.put(FIELD_DATA, mEditText.getText().toString()); mydb.insert("mytable", null, values); break; .....省略 |
○データをSQLiteから検索し取得する
SQLiteDatabaseクラスのexecSQLメソッドを紹介しましたが、execSQLメソッドではSELECT文を
実行することができません。
検索を実行する場合には、SQLiteDatabaseクラスqueryメソッドを利用することになります。
1.SQLiteDatabaseクラスqueryメソッドからCursorクラスのインスタンスを取得する
2.取得したカーソルをCorsorクラスのmoveToFirstメソッドを利用し移動します。
3.現在カーソルが指しているテーブルの情報を、CorsorクラスのgetStringメソッドを利用し取得する。
queryメソッドは引数に検索指定を入力するのに対し、rawQueryメソッドにはSELECT文のSQL文を入力することができます。
煩雑な検索を行う際や、SQL文になれている場合においてはrawQueryメソッドを利用すると簡易に検索を実行することができます。
rawQueryメソッドを利用した場合の使用方法も、コメントアウトしソースコード内に書き込んでいます。
ソースコード内5〜8行目において、queryメソッドを呼び出しています。
SQLiteDatabaseクラスqueryメソッド
| String table | テーブル名 |
|---|---|
| String[] columns | Field名を指定する |
| String selection | WHERE句を指定する |
| String[] selectionArgs | WHERE句において?を使用した場合に使用 |
| String groupBy | GROUP BY句を指定する |
| String having | HAVING句を指定する |
| String orderBy | ODERBY句を指定する |
この検索文をSQL文にて書き表すと以下になります。
SELECT _id,data FROM sample_table WHERE ‘_id=入力値’;
また、19行目20行目においてCursorクラスのgetStringメソッドを呼び出しています。
getStringメソッドにはカラムの番号を指定する必要がありますが(0オリジン)、CursorクラスのgetCulumnIndexクラスを使用することでカラム番号を取得することが出来ます。
src/DBShowActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /* 検索の処理 */// queryを使用// query(table名,field名(String[]),検索語,検索語に?がある場合に使用,GROUP BY,HAVING,ORDER// BY)Cursor mCursor = mydb.query(DBSampleActivity.TABLE_NAME, new String[] { DBSampleActivity.FIELD_ID, DBSampleActivity.FIELD_DATA }, DBSampleActivity.FIELD_ID+"=?" , new String[]{serchNum.getText().toString()}, null, null, null);// rawQueryを使用// String SQL_SELECT = "SELECT " + DBSampleActivity.FIELD_ID + ","// + DBSampleActivity.FIELD_DATA + " FROM "// + DBSampleActivity.TABLE_NAME + " WHERE "// + DBSampleActivity.FIELD_ID + "=" + rgex + ";";// selectionArgs : WHERE句を使用するときに指定する。// Cursor mCursor = mydb.rawQuery(SQL_SELECT, null);// Cursorを先頭に移動する 検索結果が0件の場合にはfalseが返るif (mCursor.moveToFirst()) { String text = mCursor.getString(mCursor .getColumnIndex(DBSampleActivity.FIELD_DATA)); // TextViewに表示する showField.setText(text);} else { // 検索結果が無いのでTextViewをクリアする showField.setText(null);} |
○データをSQLiteから削除する
データを削除する際には、SQLiteDatabaseクラスdeleteメソッドを利用します。
SQLiteDatabaseクラスqueryメソッド
| String table | テーブル名 |
|---|---|
| String whereClause | WHERE句を指定する |
| String[] whereArgs | WHERE句にて?を利用した場合に使用する |
サンプルでは以下ソースコードにおいて、削除の処理を行っています。
src/DBShowActivity.java
1 2 | mydb.delete(DBSampleActivity.TABLE_NAME, DBSampleActivity.FIELD_ID + "=?", new String[] { serchNum.getText().toString() }); |
以上ながながとお疲れさまでした。