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データベースを抽象化する機能がいくつか用意されていますが、基本的な操作は他の環境で馴染んだ「データベースの基本操作」でできそうですね。


創作プログラミングの街