データベースを使ったデータ保存

データベースを手軽に扱うためのクラスとしてAndroidではSQLiteDatabaseクラスを使ってデータベースにアプリのデータを保存できます。

このクラスを使ってデータベースを作ってデータを取り出すまでの手順を簡単にまとめると次の手順になります。

  1. SQLiteOpenHelperクラスを拡張
  2. ヘルパークラスからデータベースを取得してデータの書き込み

SQLiteOpenHelperクラスの拡張

初めにデータベースの作成を管理するクラスであるSQLiteOpenHelperクラスを拡張したクラスを作ります。

/**データベースのヘルパークラス*/
public class MyDBHelper extends SQLiteOpenHelper 
{
    public static final String TABLE_NAME = "anim_table";
        //テーブル名
    public static final String PET_NAME_KEY = "name";
    public static final String PET_TYPE_KEY = "type";
    
    public MyDBHelper(Context context, String name, CursorFactory factory, int version) 
    {
        super(context, name, factory, version);
    }

    /**テーブルの初期化*/
    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        try{
            db.execSQL(
                String.format(
                    "create table %s (" +
                        "_id integer primary key autoincrement not null, " +
                        "file_name text not null, " +
                        "anim_type text " +
                        ");",
                    TABLE_NAME)
            );
        }catch(SQLiteException err){
            Log.e(LOG_TAG, "sql statement is invalid");
        }
    }
    
    /**データベースのアップグレード時の処理*/
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
        
    }
}

このクラスはabstractなメソッドとしてonCreateonUpgradeというメソッドを持っていてそれぞれ次の役割を持ちます。

onCreateはデータベース初期化時にしか呼ばれないのでデータベースを開くたびに何か処理をしたければonOpenをオーバーライドすればOKです。

データベースを開く

データベースを開くには次のコードを書きます。

MyDBHelper dbHelper = new MyDBHelper(this, "name_list.db", null, 1);
SQLiteDatabase db = dbHelper.getWritableDatabase();

データベースはファイルとしてアプリ専用のディレクトリ上に作成されます。例えばこの例なら「name_list.db」という名前で「data/data/パッケージ名/databases」ディレクトリにファイルが作成されるはずです。

ここでは行を挿入するのでgetWritableDatabaseメソッドでデータベースを取得しています。

SQLiteOpenHelperonCreateはヘルパークラスを作った時点ではなく、データベースを取得したときに呼び出されるので注意です。

値の書き込み

では実際に行を挿入してデータベースに書き込みしてみます。

それが次のコードです。

public void insertValues(SQLiteDatabase db, String petName, String type)
{
    ContentValues values = new ContentValues();
    values.put(MyDBHelper.PET_NAME_KEY, petName);
    values.put(MyDBHelper.PET_TYPE_KEY, type);
    db.insert(MyDBHelper.TABLE_NAME, null, values);
        //データベースの行を挿入
}

このメソッドでテーブルに1つの行を挿入しています。

例えばこのメソッドを使って

insertValues(db, "Poti", "dog");
insertValues(db, "Tama", "cat");

という風に行を挿入すると次のイメージ図のようなテーブルが出来上がります。

テーブルのイメージ図

各行の左の番号がデータベースが自動的に割り振らたIDでその後に各列の値が続いています。

値の取り出し方

各行から列の値を取り出したい場合はCursorクラスを使います。例えば次のようにして

try{
    cursor = db.query(MyDBHelper.TABLE_NAME, null,
                                null, null, null, null, null);
    int petNameIndex = cursor.getColumnIndex(MyDBHelper.PET_NAME_KEY);
    int petTypeIndex = cursor.getColumnIndex(MyDBHelper.PET_TYPE_KEY);
    String petName, petType;
    cursor.moveToFirst();
    while(!cursor.isAfterLast()){
        petName = cursor.getString(petNameIndex);
        petType = cursor.getString(petTypeIndex);
        Log.i("MainActivity : ", "petName = " + petName + "   petType = " + petType);
        cursor.moveToNext();
    }
    cursor.close();
}finally{
    if(cursor != null)
        cursor.close();
}

Cursorクラスの1つの行がデータベースの1つの行に相当していてインデックス番号からそれぞれの列の値にアクセスできます。

関連項目
プライバシーポリシー