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
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
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メソッドの処理を行っています。
@Override public 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
/* 検索の処理 */ // 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
mydb.delete(DBSampleActivity.TABLE_NAME, DBSampleActivity.FIELD_ID + "=?", new String[] { serchNum.getText().toString() });
以上ながながとお疲れさまでした。