mucchinのAndroid戦記

Androidアプリのデータ保存方法の一つ「SQLite」の使い方 SQLiteOpenHelper編

Androidのデータベース「SQLite」の使い方は?

今回は、AndroidアプリからSQLiteを使用する際の、コードレベルでの使い方をみていきましょう。
長くなりそうなので、3記事に分けたいと思います。
今回は、SQLiteOpenHelperというクラスの使い方について触れたいと思います。

今回は、データベースのオープン処理の説明になります。
行の追加・更新・削除編は下記のページをご覧下さい。
Androidアプリのデータ保存方法の一つ「SQLite」の使い方 行の追加・更新・削除編
レコードの検索編は下記のページをご覧下さい。
Androidアプリのデータ保存方法の一つ「SQLite」の使い方 レコード検索編


まず、Androidでは、データの保存形式として、今回のSQLiteの他にも、「プリファレンス」「ローカルファイル」があります。以前にこれらの記事を書いています。
Androidアプリのデータ保存方法の一つ「プリファレンス」の使い方
Androidアプリのデータ保存方法の一つ「ローカルファイル」の使い方

まずは、この中から何を使ってデータを保持させるかを検討しましょう。
保存するデータ量が明らかに少なくて、プリファレンスで事足りるのであれば、プリファレンスで充分だと思います。
SQLiteは、同じような組み合わせのデータを複数保持させるような、例えば電話帳やブックマーク等のような感じでデータを保存させる場合に使うといいでしょう。


少し話しがそれました。それではSQLiteの使い方を見ていきます。

まず手始めに行う作業は、以下です。

SQLiteOpenHelperのサブクラスの実装

必須ではありませんが、SQLiteOpenHelperのサブクラスの実装を行います。
このクラスは、文字通り、データベースオープン時に使えば便利なクラスです。
HTTP通信や入出力ストリームと同じく、データベースを使用するときは、最初にオープン⇒読み取りや書込み⇒最後にクローズ、という手順を踏みます。

このクラスを使うと発生する利点は、以下のような点です。
・DBオープン時、もしテーブルが存在していないときはテーブル生成を行う事ができる。
・テーブルのバージョンアップが感知できる。

言葉で見てもよくわかりませんので、コードを見てみましょう。
例えば、以下のようなクラスを実装します。


class SubOpenHelper extends SQLiteOpenHelper{

  public SubOpenHelper(Context c,String dbname,int version){
    super(c,dbname,null,version);
  }

  public void onCreate(SQLiteDatabase db){
    db.execSQL(“create table -省略-“);
  }

  public void onUpgrade(
      SQLiteDatabase db,int oldVersion,int newVersion){
    実装例
    //現在のレコードを取得して、一旦メモリへ退避。
    //テーブルの削除
    //新しくテーブルを作り直して、
    //メモリへ退避させたレコードを挿入する etc
  }
}


スポンサーリンク




コンストラクタ

まずはコンストラクタを見ましょう。
スーパークラスのコンストラクタを呼び出してます。
第一引数は、Context型インスタンスです。
自身のアプリを示す場合は、getApplicationContext()を使って生成します。
第二引数は、DBファイル名です。
第四引数は、DBのバージョンで、作成するときに指定できます。
例えば、テーブルの仕様を変えた後であれば、この数値を上げてやる、という使い方が出来ます。
第3引数にはCursorFactory型インスタンスを渡すのですが、とりあえず普通に使う分には使わないのでnullでいいです。(私も良く知らないので、もし余力があれば調べて、別記事で紹介します。)

onCreateメソッド

このインスタンスを使ってデータベースをオープンする時に、もし指定されたデータベースが無い場合に、自動的に実行されるメソッドです。
ここでは、このデータベースで使用するテーブルのCreate文の発行を行えばよいでしょう。
その他、デフォルトで入れておきたいレコードがあれば挿入してやるなどの処理も行えます。

既にデータベースが存在しているときに、このインスタンスが生成されたとしても実行されません。

onUpgradeメソッド

データベースのバージョンが上がったときに自動的に実行されるメソッドです。
このインスタンスを使ってデータベースをオープンするときに、コンストラクタで渡したバージョンと、実際に存在しているデータベースのバージョンが違うときに呼び出され、古いバージョンの値と、新しいバージョンの値は引数としても渡されてきます。
サンプルコードでは、処理の実体を書いていませんが、例えば、テーブルの仕様を変えたという想定ですと、一旦データを取り出しておいてメモリに持たせておき、今のテーブルを消して、新しくテーブルを作り直して、取り出しておいたレコードをちゃんと挿入しなおす、という処理を行う事ができます。
不必要なら処理を書かなくてもいいですが、定義をしておかないとコンパイルが通りません。


こんな感じで、SQLiteOpenHelperを実装しておきます。

データベースのオープン処理

では、次は、データベースにテーブルを作ったり、レコードを挿入したり検索したりする前に、最初に行うべきデータベースのオープン処理をみてみましょう。
以下のようなコードになります。


SQLiteDatabase sdb;
SubOpenHelper helper =
  new SubOpenHelper(getApplicationContext(),”test.db”,1);
try{
  sdb = helper.getWritableDatabase();
  //もしくは、
  //sdb = helper.getReadableDatabase();
}catch(SQLiteException e){
  //異常終了
  return;  
}


まずは、先ほど実装したSQLiteOpenHelperのサブクラスのインスタンスを生成します。
そして、そのインスタンスの、getWritableDatabase()メソッドを使って、データベースをオープンします。
読み取り専用でいいときは、getReadableDatabase()でも使用できます。
もし、getWritableDatabese()でデータベースをオープンしたとき、ディスクの容量が不足していると、SQLiteExceptionがスローされます。
この場合に、もし読み取り専用でいいから開きたい場合は、catch句の中にgetReadableDatabese()を記述してもいいです。


getWritableDatabase()、もしくはgetReadableDatabase()メソッドの戻り値SQLiteDatabase型インスタンスを使って、レコードの挿入や削除、検索を行っていきます。
今回はここまでとしまして、次回にその方法を紹介します。
レコードの追加、更新、削除に関しての記事は下記です。
Androidアプリのデータ保存方法の一つ「SQLite」の使い方 行の追加・更新・削除編
レコードの検索に関しての記事は下記です。
Androidアプリのデータ保存方法の一つ「SQLite」の使い方 レコード検索編