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
のように出力されるだろう。