データベース操作サンプルの画面構成とスキーマ
- - PR -
今回作成したサンプルは、都道府県データベースアプリケーションです。
![]() |
| 図1 都道府県アプリケーション画面 |
都道府県名を変更すると、県庁所在地と郷土料理が切り替わります。都道府県名も県庁所在地も郷土料理名もすべてデータベースから取得しています。データベースのスキーマは以下のようになっています。
![]() |
| 図2 データベーススキーマ |
県庁所在地は各都道府県に必ず1つだけ存在するので、プライマリキーを設定しています。郷土料理はいくつ存在するか分からないため、プライマリキーはありません。この2つのテーブルは都道府県でリレーションしています。
なお、郷土料理が登録されていない県がありますが、あしからずご了承ください。
Androidのデータベースを作成するには?
スキーマが決まったら、データベースを作成します。
データベースの作成方法はいろいろありますが、今回は「SQLiteOpenHelper」というクラスを利用します。このクラスは、abstract(抽象)クラスなので、以下のコールバックを実装する必要があります。
- public void onCreate(SQLiteDatabase db)
データベースを作成したタイミングで呼び出される。通常はここでテーブルを作成する。今回はデータもこのタイミングで追加している - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
データベースをバージョンアップしたタイミングで呼び出される。通常はここでデータのコンバートなどを行う。今回は使用しないので、空実装
データベースの存在チェックやテーブルの作成、初期データの追加、データベースのバージョンアップ時の処理などが、このクラスを使用することで分離できるので、SQLiteDatabaseクラスでデータベースを直接作成するよりも便利だと思います。
トランザクションとプリコンパイルステートメントとは?
テーブルにレコードを追加する場合、通常は1レコードずつ追加しなければなりません。これを素直に実装すると、以下のようになります。
for (String s : array) {
db.execSQL(“insert into table values (‘” + s + “’);”);
}
1レコードを追加する場合であれば、この方法で十分ですが、複数レコードを追加するのであれば、以下のようにトランザクションとプリコンパイルステートメントを使うことを推奨します。
db.beginTransaction();
try {
SQLiteStatement stmt = db.compileStatement("insert into table values (?);");
for (String s : array) {
stmt.bindString(1, s);
stmt.executeInsert();
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
このコードは前述のexecSQLを単体で実行するのに比べ、以下のメリットがあります。
- 途中で失敗した場合ロールバックができる
- 高速
■ ロールバック
上記のコードでは、tryブロックの最後のSQLiteDatabase#setTransactionSuccessful()を呼び出すと、データベースへの変更がコミットされ、呼び出さなければロールバックされます。「例外が発生したらロールバックする」という実装ですね。
■ 処理速度
処理速度にどれぐらいの差異があるのか計ってみました。以下は、今回のサンプルアプリケーションで約190レコードを追加する際にかかった時間です。
| 表1 処理速度の比較 | |||||||||||||||||||||
|
トランザクション+SQLiteStatemenの方がおよそ半分の時間で済んでいます。レコード数が増えれば増えるほど、この差はどんどん大きくなります。
データベースの保存場所はメモリ? ストレージ?
SQLiteはクライアント・サーバ型のデータベースとは異なり、アプリケーションに組み込んで使用するようにデザインされています。AndroidのSQLiteの場合、データベースはデータベースを作成したアプリケーション専用です。
さらにAndroidの場合、データベースの作成場所をストレージにするか、メモリにするかを選択できます。今回のデモアプリはデータが少ないので、メモリ上にデータベースを作成しています。
■ データベースの保存場所を指定するには?
ストレージに作成するかメモリに作成するかは、DatabaseHelperクラスのコンストラクタの第2引数で指定します。
public DatabaseHelper(Context context) {
super(context, null, null, 1);
}
ここがnullならメモリ上に、ファイル名を指定した場合は「/data/data/<パッケージ名>/database/<ファイル名>」に、という具合にデータベースファイルが作成されます。指定するのはファイル名だけなので、間違えないようにしてください。
■ データベースの存在チェックは不要
ファイル名を指定した場合は、2回目以降の起動でデータベースがすでに存在する可能性があるのですが、もし存在するならDatabaseHelper#onCreate(SQLiteDatabase)メソッドは呼び出されません。DatabaseHelperを使用すれば、データベースの存在チェックを行わなくてもよいわけです。本当に便利です。
次ページでは、データベースを削除する際の注意点やデータ検索の仕方の基本を解説します。
| Index | ||||||||
|
||||||||
Androidで動く携帯Javaアプリ作成入門 バックナンバー 連載インデックスへ»
- 第1回 Android Market配布を目指しEclipseでHelloWorld!
- 第2回 Androidアプリ作成の基本“Activity”とは何か?
- 第3回 ブラウザや地図、ストリートビューの基、Intentとは?
- 第4回 簡単でワクワクするAndroidウィジェット10連発!
- 第5回 Androidアプリの使いやすさを左右する5つのレイアウト
- 第6回 AndroidでSQLiteのDB操作をするための基礎知識
- 第7回 常駐アプリが作成できるAndroidの“サービス”とは
- 第8回 アプリを国際化してAndroid Marketから世界へ発信
- 第9回 Netbookにも広まるAndroidで、かつてないWeb体験を
- 第10回 Androidのホーム画面に常駐するアプリを作るには
- 第11回 Android 1.6のジェスチャーとテキスト読み上げを使う
- 第12回 SurfaceViewならAndroidで高速描画ゲームが作れる
- 第13回 iPhoneより多彩なAndroidのセンサをアプリで操作
- 第14回 Android 2.1の新機能で作る、美しく燃える“待ち受け”
- 第15回 Android NDKでJNIを使用してアプリを高速化するには
- 第16回 地図/位置情報/GPSを使うAndroidアプリを作るには
- 第17回 もはやケータイに必須のカメラをAndroidで制御しよう
- 第18回 開発者が知っておきたいAndroid 2.2新機能 12連発
- 第19回 XMLレイアウトでAndroidアプリに“設定画面”を追加
- 第20回 Androidアプリで“アニメーション”するための基礎知識
- 第21回 アニメーションでAndroidに独創的な画面エフェクトを
- 第22回 開発者が知って得するAndroid 2.3の新機能18選
- 第23回 Android 3.0の新APIで簡単ドラッグ&ドロップ実装
- 第24回 Androidの画面の大きさの違いを解決するFragments
- 第25回 Compatibility packageで2.x系でもマルチサイズ対応
- 第26回 開発者が知らないと損するAndroid 4.0の新機能44選
- 第27回 Android 4.0でアプリ開発を始めるための環境構築
- 第28回 Android 4.0で注目の顔認識をアプリに組み込むには
- 第29回 Androidのウィジェットにノーティフィケーションするには
- 第30回 Androidアプリでマルチメディアを扱うための基礎知識
- 第31回 Android 4.0のサービス/プロセス間通信の基本
| ご意見、ご感想は Smart&Social 会議室へどうぞ |
| Smart&Social フォーラム トップページへ |
TechTargetジャパン
- JenkinsでCIすればAndroidアプリ開発はもう怖くない (2012/5/23)
Androidアプリ開発における継続的インテグレーションの重要性やJenkinsの利点を解説し、環境構築の仕方や使い方の手順を紹介します - Open Graphアプリを作りApp Centerに登録するには (2012/5/18)
ユーザーの活動を共有できるFacebookの新機能を使ったアプリの開発方法と新しいアプリストアへの登録手順を解説 - Bootstrap、Hogan.js、FinagleなどTwitter系OSS (2012/5/15)
Twitterのアーキテクチャやオープンソースへの取り組みなどの講演模様をお届け。OpenJDKやStorm、Gizzard、Twitter4Jも注目 - ソーシャルゲーム/スマホ開発イベント記事が人気 (2012/5/11)
4月はソーシャルゲームの開発者向けイベントや、Webとネイティブの対決が熱かった! UnityやPerfumeも見逃せない!?
|
|
キャリアアップ
スポンサーからのお知らせ
イベントカレンダー
- - PR -



