世界を目指せ!Androidアプリ開発入門

第8回 AndroidのSQLiteを学ぶ

この記事を読むのに必要な時間:およそ 3 分

レコードの追加

テーブルへのレコード追加は,以下のようなコードになります。

public void add( String caption ) {
	ContentValues val = new ContentValues();

	val.put( "caption", caption );
	m_db.insert( TBL_NAME, null, val );
}

レコードの追加には,ContentValuesクラスを使います。

ContentValuesクラスは,テーブルに含まれるカラムをキーとし,カラムに対して設定したい値をペアとして保存するためのクラスです。ContentValuesクラスのputメソッドの第一引数にカラム名を表すStringクラスの値を指定します。そして,第二引数にカラムに設定されているデータ型に対応したクラスの値を指定します。

m_dbは,SQLiteOpenHelperのgetWritableDatabaseメソッドで取得したSQLiteDatabaseクラスのハンドルです。SQLiteDatabaseクラスのinsertメソッドの第三引数にContentValuesを渡してレコードを追加します。

レコードの更新

レコードの更新は,レコード追加と似たコードで,以下のようになります。

public void update( int id, String caption ) {
	ContentValues val = new ContentValues();

	val.put( "caption", caption );
	m_db.update( TBL_NAME, val, "_id=?", new String[] { Integer.toString( id ) });		
}

追加と同様に,ContentValuesクラスのputメソッドの第一引数にカラム名を表すStringクラスの値を指定します。そして,第二引数にはカラムに設定されているデータ型に対応したクラスの値を指定します。

SQLiteDatabaseクラスのupdateメソッドでレコードの更新を行います。

updateメソッドは,第二引数で設定した値を,第三引数で指定した条件に一致するレコードを更新します。第四引数では,第三引数で指定する条件の引数を指定します。引数の変数は「?」で指定します。

レコードの読み出し

レコードの読み出しは,以下のようなコードになります。

public String[] loadAll()
{
	int						i;
	Cursor					c;
	String[]		entries;

	if( m_db == null )
       	return null;

	c = m_db.query( TBL_NAME,
					new String[] { "_id", "caption" },
					null, null, null, null, null );
	
	int numRows = c.getCount();

	c.moveToFirst();

	entries = new String[numRows];
		for( i = 0; i < numRows; i++ )
		{
			entries[i] = c.getString(1);
			c.moveToNext();
 		}
		c.close();

	return entries;
}

まずは,SQLiteDatabaseクラスのqueryメソッドを使い,レコードを取得します。

今回は,queryメソッドの第三引数に一致条件を指定していないので,すべてのレコードが読み出されます。

queryメソッドの実行が成功すると,Cursorクラスのハンドを返します。CursorクラスのgetCountメソッドを呼び出して,レコードの総数を取得して,entriesに格納場所を確保しています。

後は,件数分だけループを回して,レコードの読み出しを行います。

forループの中では,CursorクラスのgetStringメソッドを使ってフィールドを読み取ります。

getStringの第一引数に指定する値は,読み取りたいカラムの位置になります。

これは0から始まります。⁠caption」を取得する場合は1を指定します。フィールドを読み取ったら,moveToNextメソッドで読み出し位置を移動します。

パフォーマンスチューンと利用の注意点

SQLiteは,いかがでしょうか?

組み込み向けと言っても,他のデータベースシステムと大きく使い方が変わるワケではないので,初回から手応えを感じている方も多いのではないでしょうか?そのSQLiteですが,以下に注意して使うと,アプリのパフォーマンスを向上させることができるので,頭に入れておいて下さい。

  • 読み込むフィールド数は,出来る限り少なくする
  • レコードは,まとめて読み込み,まとめて表示する
  • 読み込みレコード数が分かっている場合は,query実行時にlimitを設定する

Android OSに搭載されているSQLiteは,スレッドセーフでコンパイルされていないようで,複数のスレッドから使うと場合によってはクラッシュします。マルチスレッド下で使う場合は,排他処理を行うか自前でハンドルを管理する必要がありますが,筆者の場合は,SQLiteDatabaseハンドルへの参照回数をDBOpenHelperで管理して対応しています。詳細は,サンプルプログラムのDBOpenHelperのgetWritableDatabase, getWritableDatabase,MainStoreのコンストラクタのコードを参照して下さい。

まとめ

今回は,SQLiteに関して,以下のご説明をしました。

  • テーブルの作成
  • アップグレード処理
  • レコードの追加
  • レコードの更新
  • レコードの読み出し

多くのアプリがSQLiteを使ってレコード読み込み・保存をはずなので,サンプルプログラムを修正する試行錯誤して自分の物にしてください。

著者プロフィール

傍島康雄(そばじまやすお)

5月30日生まれ。

モバイルデバイスが大好物。それで動くアプリの開発に喜びを感じている。スマートフォン前夜のWindows Mobile,PalmOSのアプリに情熱を傾けていたが,最近は停滞気味でコードを書くよりも文章を書く機会が多くなっており,文章を書くのも,プログラミングと同じくらい奥深い作業だと感じている。

ブログ:http://yasuos.com/blog/