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クラスを作成しています。

25行目:
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文を見比べ、構文のイメージをつかみましょう。

CREATE TABLE sample_table
_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[] columnsField名を指定する
String selectionWHERE句を指定する
String[] selectionArgsWHERE句において?を使用した場合に使用
String groupByGROUP BY句を指定する
String havingHAVING句を指定する
String orderByODERBY句を指定する

この検索文を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 whereClauseWHERE句を指定する
String[] whereArgsWHERE句にて?を利用した場合に使用する

サンプルでは以下ソースコードにおいて、削除の処理を行っています。
src/DBShowActivity.java

	mydb.delete(DBSampleActivity.TABLE_NAME, DBSampleActivity.FIELD_ID
			+ "=?", new String[] { serchNum.getText().toString() });

以上ながながとお疲れさまでした。