Androidには標準でSQLiteが組み込まれている。
その基本的な使い方を見てみよう。
SQLiteOpenHelperを使うと、DBのオープンやバージョンのチェックなどをやってくれるので便利である。
そこで、SQLiteOpenHelperを継承したクラスを作ることから始める。
LessonDb.java
package com.lesson.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class LessonDb extends SQLiteOpenHelper { private static int DB_VERSION = 1; private static String DB_FILENAME= "lesson.db"; public LessonDb(Context context){ super(context,DB_FILENAME,null,DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.d("LessonDb", "onCreate"); // ここでDBの作成、初期データの投入を行う db.execSQL("CREATE TABLE Persons (" + "Id INTEGER PRIMARY KEY AUTOINCREMENT," + "Name TEXT )"); db.execSQL("INSERT INTO Persons(Name) VALUES('John');"); db.execSQL("INSERT INTO Persons(Name) VALUES('Tom');"); db.execSQL("INSERT INTO Persons(Name) VALUES('Taro');"); db.execSQL("INSERT INTO Persons(Name) VALUES('Mike');"); db.execSQL("INSERT INTO Persons(Name) VALUES('Bill');"); db.execSQL("INSERT INTO Persons(Name) VALUES('Bob');"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // アップグレード時に呼ばれる } }
オーバーライドしたonCreate()メソッドはDBの新規作成時に呼ばれるメソッドで、
ここにDBの作成処理と初期データの投入処理を書く。
ここでは
Persons
Id | INTEGER型、プライマリーキー、オートインクリメント |
---|---|
Name | TEXT型 |
という構造のテーブルを作成し、初期データの投入を行っている。
それでは、このテーブルのデータをSelectしてみよう。
メインのソースは以下のようになる。
MainActicity.java
package com.lesson.db; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SQLiteDatabase db = null; try{ db = new LessonDb(this).getReadableDatabase(); Cursor c = null; try{ c = db.query( "Persons", new String[]{"Id","Name"}, null, null, null, null, "Id"); while( c.moveToNext() ){ Log.d("result","" + c.getInt(0) + " " + c.getString(1)); } }catch(Exception e){ }finally{ if( c != null ){ c.close(); c = null; } } } catch(Exception e){ }finally{ if(db != null){ db.close(); db = null; } } } }
19行目のgetReadableDatabase()でSQLiteDatabaseを取得している。
ここで、DBがまだ存在しないときはSQLiteHelperのonCreate()が呼ばれてDBが作成される。
DBが既に存在しているときは、そのDBを返す。
23行目のSQLiteDataBase#query()メソッドでDBのデータをSelectしている。
ここでは、SQLiteDataBase#rawQuery()メソッドを使って
c = db.rawQuery("SELECT Id,Name FROM Persons ORDER BY Id", null);
のように書いても良い。
実行すると、ログに
05-12 05:13:43.075: D/result(666): 1 John
05-12 05:13:43.075: D/result(666): 2 Tom
05-12 05:13:43.094: D/result(666): 3 Taro
05-12 05:13:43.094: D/result(666): 4 Mike
05-12 05:13:43.094: D/result(666): 5 Bill
05-12 05:13:43.094: D/result(666): 6 Bob
05-12 05:13:43.075: D/result(666): 2 Tom
05-12 05:13:43.094: D/result(666): 3 Taro
05-12 05:13:43.094: D/result(666): 4 Mike
05-12 05:13:43.094: D/result(666): 5 Bill
05-12 05:13:43.094: D/result(666): 6 Bob
のように出力される。
WHERE句を使った条件指定を行う場合についても見ておこう。
例えば、以下の例では先頭の名前が”T”のデータを抽出している。
c = db.query( "Persons", new String[]{"Id","Name"}, "Name LIKE ?", new String[]{"T%"}, null, null, "Id");
rawQuery()メソッドを使った場合は以下のようになる。
c = db.rawQuery( "SELECT Id,Name FROM Persons WHERE Name LIKE ? ORDER BY Id", new String[]{"T%"});
実行すると、ログに
05-12 05:27:26.665: D/result(782): 2 Tom
05-12 05:27:26.665: D/result(782): 3 Taro
05-12 05:27:26.665: D/result(782): 3 Taro
のように出力されるだろう。