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

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

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メソッドの処理を行っています。

1
2
3
4
5
6
7
8
9
10
11
@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

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

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

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

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