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」の使い方 レコード検索編