前回の第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文を記述しなくてもデータベースのデータを扱うことができる。