SQLiteデータベースを使ってみる
Androidでは、SQLiteデータベースを使うことができます。
SQLiteは、メモリ上やファイルにバイナリデータとしてデータベースを構築し、SQL文で読み書きできるデータベース機能を提供するライブラリです。データベースサーバーを必要とせず、一つのファイル(バイナリイメージ)にデータを格納できるので、扱いやすいのが利点。
Androidには、SQLiteデータベースの作成や管理を行うSQLiteDatabaseクラスが用意されているので、まずはこのSQLiteDatabaseクラスを使ってデータベースとテーブルの作成、データの読み書きを試してみましょう。
とりあえず、Android端末のメモリ上にstaticメソッドcreate()でデータベースを作ってみます。
// メモリ上にSQLiteのデータベースを作成 SQLiteDatabase db = SQLiteDatabase.create(null);
これで、SQLiteデータベースのオブジェクトが作成されました。メモリ上に作成したデータベースオブジェクトは、close()すると削除されます。
続いて、SQL文をexec()してテーブルとデータを作ります。
// テーブル作成のSQL文を実行
db.execSQL("create table test(id integer primary key, name text, age integer)");
// SQL文でデータ追加
db.execSQL("insert into test values('1', 'abc', '11')");
AndroidのSQLiteDatabaseクラスにはデータ追加用にinsert()メソッドも用意されているので、そちらも試してみましょうか。こちらは、KEY-VALUE型のデータオブジェクト(ContentValues)を引数に渡すと、keyを列名、valueをデータとしてテーブルにinsertします。プログラムの中でデータを加工しながら追加する場合は、SQLとして文字列化する必要がない分insert()を使った方がやりやすい場合もあるかもしれませんね。
// key-value型データを保持するContentValuesオブジェクトを作成
ContentValues item = new ContentValues();
// データ設定
item.put("id", 2);
item.put("name", "def");
item.put("age", 2);
// データ追加
db.insert("test", null, item);
このようにして作成した(あるいは既存の)SQLiteデータベースは、クエリで検索できます。今回は、SQLクエリで直接データを取得するrawQuery()メソッドを試してみました。
// 検索クエリを実行し、結果をCursorに格納 Cursor c = db.rawQuery("select * from test", null);
クエリの結果として返されるCursorは、いわゆる「レコードセット」です。条件に合うデータが行(レコード、データ)の集合として格納され、moveToNext()などのメソッドで操作対象のデータを移動しながら処理を行います。
サンプルとして、メモリ上にSQLiteデータベースを作成し、ID・名前・年齢の各項目を持つテーブルとデータを追加、データベースからSQLクエリでデータを読み込んでテキスト領域に表示するAndroidアプリを作ってみました。
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView mMonitor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// メモリ上にSQLiteのデータベースを作成
SQLiteDatabase db = SQLiteDatabase.create(null);
// テーブル作成のSQL文を実行
db.execSQL("create table test(id integer primary key, name text, age integer)");
// SQL文でデータ追加
db.execSQL("insert into test values('1', 'abc', '11')");
// key-value型データを保持するContentValuesオブジェクトを作成
ContentValues item = new ContentValues();
// データ設定
item.put("id", 2);
item.put("name", "def");
item.put("age", 2);
// データ追加
db.insert("test", null, item);
// データ設定
item.put("id", 3);
item.put("name", "ghi");
item.put("age", 4);
// データ追加
db.insert("test", null, item);
// データ設定
item.put("id", 4);
item.put("name", "jkl");
item.put("age", 8);
// データ追加
db.insert("test", null, item);
// 検索クエリを実行し、結果をCursorに格納
Cursor c = db.rawQuery("select * from test", null);
// 実験結果表示用文字列を作成
String info = c.getCount() + "件\n";
// Cursor内のデータを文字列に列記
while (c.moveToNext()) {
// Cursor内の各rowのデータを追記
for (int i = 0;i < c.getColumnCount();i++) {
if (i != 0) {
info += "/";
}
info += c.getString(i);
}
info += "\n";
}
db.close();
// 文字列表示用TextVieew
mMonitor = new TextView(this);
// Activityに追加
setContentView(mMonitor);
// 表示する文字列を設定
mMonitor.setText(info);
}
}
Androidのライブラリには、SQLiteデータベースを抽象化する機能がいくつか用意されていますが、基本的な操作は他の環境で馴染んだ「データベースの基本操作」でできそうですね。