前回の第316話では,AndroidでSQLiteデータベースを作成し,SQLのDDL文を実行して,テーブルを作成する方法を説明した。SQLiteOpenHelperクラスを継承すれば,簡単にデータベースやテーブルを作成できることがおわかりいただけたと思う。

 今回は作成したテーブルにレコードを追加し,そのレコードを表示する処理を作ってみる。レコードの操作にはSQLiteDatabaseクラスを使う。

--------------------------------------------------------------

DatabaseHelper dbHelper = new DatabaseHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();
values.put(COLUMN_DATE, "2010-01-01");
values.put(COLUMN_TITLE, "Happy New Year");
values.put(COLUMN_MEMO, "New Year 2010 comes ");
db.insert(TABLE_NAME, null, values);

values = new ContentValues();
values.put(COLUMN_DATE, "2010-01-02");
values.put(COLUMN_TITLE, "Second day 2010");
values.put(COLUMN_MEMO, "1 day pasted 2010");
db.insert(TABLE_NAME, null, values);

db.close();

--------------------------------------------------------------

 DatabaseHelperクラスのインスタンスを作成して,テーブルを作成するところは前回に説明した。まず,レコードを追加したいので,getWritableDatabaseメソッドで読み書き両用のデータベース・ハンドルを取得する。

 次に,ContentValuesクラスのインスタンスにフィールド名と値を積む。大文字のCOLUMN_DATEなどは,以下のようにクラスの先頭で定数として宣言してある。

--------------------------------------------------------------

private static final String TABLE_NAME = "memotb";

private static final String COLUMN_ID = "rowid";
private static final String COLUMN_DATE = "date";
private static final String COLUMN_TITLE = "title";
private static final String COLUMN_MEMO = "memo";
private static final String[] COLUMNS =
{COLUMN_DATE,COLUMN_TITLE};

--------------------------------------------------------------

 レコードの追加はinsertメソッドで実行する。insertメソッドは,android developerのSQLiteDatabaseのページに以下のように説明されている。

--------------------------------------------------------------

long insert(String table, String nullColumnHack,
                            ContentValues values)
Convenience method for inserting a row into the database.

--------------------------------------------------------------

 戻り値の型がlongで,テーブル名,nullColumnHack,ContentValuesオブジェクトを引数にとる。上記のサンプル・プログラムではレコードを2件追加して,データベースをクローズしている。

 次に,今,追加したレコードを読み込み,表示してみる。読み込み専用なのでgetReadableDatabaseメソッドでデータベース・ハンドルを取得する。カーソルを取得するquery メソッドには,先ほど紹介したSQLiteDatabaseのページを見るとわかるように,複数のオーバーライドが存在する。以下では,テーブル名(TABLE_NAME),取得するフィールド(COLUMNS),そして,COLUMN_IDで並び替えるフィールドを指定している。

--------------------------------------------------------------

db = dbHelper.getReadableDatabase();

Cursor cursor =
  db.query(TABLE_NAME,COLUMNS,null,null,null,null,COLUMN_ID);
StringBuilder builder =
  new StringBuilder("  Date |  Title  \n");

while (cursor.moveToNext()) { 
	String date = cursor.getString(0);
	String title = cursor.getString(1);
	builder.append(date).append(": "); 
	builder.append(title).append("\n");
}

TextView tv = new TextView(this);
tv.setText(builder.toString());
setContentView(tv);

--------------------------------------------------------------

 カーソルをmoveToNextメソッドで進めて,StringBuilderオブジェクトに文字列としてレコードのフィールド値を連結している。

 TextViewオブジェクトを新規に作成して,結果を表示している。次が実行結果だ。

このようにSQLiteDatabaseクラスを使うと,SQL文を記述しなくてもデータベースのデータを扱うことができる。