SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

速習! Androidアプリケーション開発

Androidアプリでのデータベース基礎
~速習! Androidアプリケーション開発(4)~

第4回 データベースの利用

  • X ポスト
  • このエントリーをはてなブックマークに追加

データベースの作成

 それではデータベースとスキーマを作成していきます。

 まず、SQLiteOpenHelperを継承してDatabaseOpenHelperクラスを作成します。SQLiteOpenHelperのコントラクタを呼ぶとデータベースの存在チェックが行われ、存在しない場合はデータベース生成後にonCreate()が呼び出されます。存在する場合はスキーマのバージョンのチェックが行われ、バージョンが変更されているとonUpgrade()が呼び出されます。

※注

 データベースを作り直したい場合は、アプリケーションをいったんアンインストールし、再度実行します。

 スキーマの生成、データベースの操作は他のRDBMSと同様、SQLで行います。onCreate()で、先ほど作成したBizCardの定数を参照する形でcreate table文を実行します。また、今後作業を進めやすいように初期データの投入もしておきましょう。

DatabaseOpenHelper.java
package sample.bizcard.db;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * データベース処理クラス
 */
public class DatabaseOpenHelper extends SQLiteOpenHelper {

    // データベース名の定数
    private static final String DB_NAME = "BIZ_CARD";
    
    /**
     * 初期投入サンプルデータ
     */
    private String[][] datas = new String[][]{
        {"光度 人", "××商事", "開発部", "部長","141-0031", "品川区西五反田2-19-3", "090-1111-1111", "03-1111-1111", "code@shoji.co.jp"},
        {"高度 仁", "○○コミュニケーションズ", "開発部", "課長","141-0032", "品川区大崎1-2-1", "090-2222-2222", "03-2222-2222", "code@comunications.co.jp"},
        {"光度 陣", "×○システムズ", "開発部", null,"153-0043", "目黒区東山1-2-1", "090-3333-3333", "03-3333-3333", "code@systems.co.jp"},
        {"荒土 尋", "○×工務店", "開発部", null,"160-0014", "新宿区内藤町11-4", "090-4444-4444", "03-4444-4444", "code@koumuten.co.jp"}
    };

    /**
     * コンストラクタ
     */
    public DatabaseOpenHelper(Context context) {
        // 指定したデータベース名が存在しない場合は、新たに作成されonCreate()が呼ばれる
        // バージョンを変更するとonUpgrade()が呼ばれる
        super(context, DB_NAME, null, 1);
    }
    
    /**
     * データベースの生成に呼び出されるので、 スキーマの生成を行う
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.beginTransaction();
        
        try{
            // テーブルの生成
            StringBuilder createSql = new StringBuilder();
            createSql.append("create table " + BizCard.TABLE_NAME + " (");
            createSql.append(BizCard.COLUMN_ID + " integer primary key autoincrement not null,");
            createSql.append(BizCard.COLUMN_PERSON_NAME + " text not null,");
            createSql.append(BizCard.COLUMN_COMPANY_NAME + " text,");
            createSql.append(BizCard.COLUMN_ORGANIZATION_NAME + " text,");
            createSql.append(BizCard.COLUMN_POSITION_NAME + " text,");
            createSql.append(BizCard.COLUMN_ZIP_CODE + " text,");
            createSql.append(BizCard.COLUMN_ADDRESS + " text,");
            createSql.append(BizCard.COLUMN_TEL1 + " text,");
            createSql.append(BizCard.COLUMN_TEL2 + " text,");
            createSql.append(BizCard.COLUMN_MAIL + " text");
            createSql.append(")");

            db.execSQL( createSql.toString());

            // サンプルデータの投入
            for( String[] data: datas){
                ContentValues values = new ContentValues();
                values.put(BizCard.COLUMN_PERSON_NAME, data[ 0]);
                values.put(BizCard.COLUMN_COMPANY_NAME, data[ 1]);
                values.put(BizCard.COLUMN_ORGANIZATION_NAME, data[ 2]);
                values.put(BizCard.COLUMN_POSITION_NAME, data[ 3]);
                values.put(BizCard.COLUMN_ZIP_CODE, data[ 4]);
                values.put(BizCard.COLUMN_ADDRESS, data[ 5]);
                values.put(BizCard.COLUMN_TEL1, data[ 6]);
                values.put(BizCard.COLUMN_TEL2, data[ 7]);
                values.put(BizCard.COLUMN_MAIL, data[ 8]);
                db.insert(BizCard.TABLE_NAME, null, values);
            }
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }

    /**
     * データベースの更新
     * 
     * 親クラスのコンストラクタに渡すversionを変更したときに呼び出される
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // データベースの更新
    }
}

 これでデータベースの準備は完了です。なお、現在のデータベースの状態はコマンドラインツール(adb.exe)から確認できます(エミュレータを起動しておく必要があります)。

adb.exe実行時の表示例
%ANDROID_SDK_HOME%tools>adb.exe shell   ←Shellを起動
# cd /data/data/sample.bizcard/databases/        ←データベースファイルのディレクトリへ移動
# sqlite3 BIZ_CARD                            ←データベースへ接続
sqlite> select * from biz_card;                   ←任意のSQLを実行
1|蜈牙コヲ縲€莠コ|テ療怜膚莠弓髢狗匱驛ィ|驛ィ髟キ|141-0031|蜩∝キ晏玄隘ソ莠泌渚逕ー2-19-3|
090-1111-1111|03-1111-1111|code@shoji.co.jp
2|鬮伜コヲ縲€莉-笳銀雷繧ウ繝溘Η繝九こ繝シ繧キ繝ァ繝ウ繧コ|髢狗匱驛ィ|隱イ髟キ|141-0032|蜩
∝キ晏玄螟ァ蟠・-2-1|090-2222-2222|03-2222-2222|code@comunications.co.jp
3|蜈牙コヲ縲€髯」|テ冷雷繧キ繧ケ繝・Β繧コ|髢狗匱驛ィ||153-0043|逶ョ鮟貞玄譚ア螻ア1-2-1|090
-3333-3333|03-3333-3333|code@systems.co.jp
4|闕貞悄縲€蟆弓笳凝怜キ・蜍吝コ慾髢狗匱驛ィ||160-0014|譁ー螳ソ蛹コ蜀・陸逕コ11-4|090-444
4-4444|03-4444-4444|code@koumuten.co.jp
sqlite> .quit                                    ←データベースとの接続を終了
# exit                                          ←Shellの終了

Tips:データベースファイルのエクスポート

 コマンドラインツールでは確認し辛い場合、次のような手順でデータベースファイルをエミュレータからエクスポートし、任意のSQLite対応のツールに読み込ませることもできます。

 [Window]-[Show View]-[Other]-[File Explorer]でFile Explorerビューを表示します。

 ツリーから対象のファイル(data/data/sample.bizcard/databases/BIZ_CARD)を選択した状態で[Pull a file from the device](下図中[1])を実行すると、指定したディレクトリにファイルがコピーされます。

File Explorerビュー
File Explorerビュー

 コピーしたファイルは、好きなツールで読み込むことができます。下記は、PupSQLiteでファイルを開いた状態です。

データベースファイルをPupSQLiteで開くとこのように表示される
データベースファイルをPupSQLiteで開くとこのように表示される

次のページ
データベースアクセスクラスの作成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
速習! Androidアプリケーション開発連載記事一覧

もっと読む

この記事の著者

横井 朗(ヨコイ アキラ)

株式会社ビーブレイクシステムズにて業務システムのパッケージソフト(MA-EYES)の製品開発から導入までを手掛けるとともに、オープンソースソフトウェア(ExCella)の開発リーダも務める。オープンソース関連について多くの執筆経験を持つ。  

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4814 2010/01/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング