【Android】SQLiteを使う DBの作成と基本的なSelect

投稿者: | 2012年5月12日

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

のように出力される。

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

のように出力されるだろう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です