- 2011年2月22日 12:24
- Android
Androidアプリでの並行処理のポイントと実現方法を
Handlerクラスを挙げて紹介しました。
今回は、その回で作成したアプリの機能のうち、
SQLiteを使用したデータベース登録機能及び抽出機能
について解説していきます。![]()
サンプルは第14回から入手可能です。
訂正とお詫び
第14回の連載の終わりに、次回の連載ではネットワーク通信処理を紹介すると
お伝えしましたが、別な連載時に変更させていただきます。
Androidには標準でSQLiteデータベースソフトウェアが組み込まれています。
SQLiteは一般的なデータベースソフトウェアのようにインストールを必要とせず、
1つのデータベースを1つのファイルで管理する特徴を持っています。
その軽量性からスマートフォンやその他小型端末で利用されているのです。
SQLiteデータベースを使用するために、
Android SDKにはSQLiteOpenHelperクラスと
SQLiteDatabaseクラスが用意されています。
これらのクラスの役割と、どのように利用するのかを見ていきましょう。
・SQLiteOpenHelperクラス
このクラスの役割をGoogleは、
A helper class to manage database creation and version management.
と定義しています。
データベースの作成と作成したデータベースのバージョン(更新管理)を管理する
Helperクラスなんですね。
開発者はこのクラスを継承して独自のクラスを作成する必要があります。
その際コンストラクタと抽象メソッドである、onCreateメソッドと
onUpgradeメソッドを定義しなければなりません。
サンプルの例を見てみましょう。
コンストラクタ
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
親クラスであるSQLiteOpenHelperクラスのコンストラクタを呼び出しています。
このようにすることで、独自に作成するHelperクラス(DatabaseHelperクラス)に
基本機能を持たせることができる、と押さえておけば良いと思います。
この親クラスのコンストラクタの引数は何でしょうか。
Googleの定義より
Create a helper object to create, open, and/or manage a database.
public SQLiteOpenHelper (Context context, String name,
SQLiteDatabase.CursorFactory factory, int version)
第一引数のContextとは直訳すると「文脈、背景、情景」ですが、
Googleの言うところでは、
Interface to global information about an application environment.
This is an abstract class whose implementation is provided by the Android system.
It allows access to application-specific resources and classes,
as well as up-calls for application-level operations such as launching activities,
broadcasting and receiving intents, etc.
掻い摘んで言うと、Androidアプリケーション全体の環境情報に関する
インターフェースで、ある特定のリソースにアクセスする操作を提供するようです。
データベースも特定のリソースに含まれるようですね。
ActivityクラスはContextクラスのサブクラスなので、
独自クラスのDatabaseHelperのコンストラクタの引数に渡す事ができます。
サンプルのDBActivityクラスより、
protected void onCreate(Bundle savedInstanceState){
・・・
helper = new DatabaseHelper(this);
・・・
}
第二引数は、作成または使用するデータベース名、
第三引数はカーソルオブジェクトです。
カーソルオブジェクトとはデータベース内の表の
レコード管理をするオブジェクトです。
独自の定義を使用する際に使用するのですが、
特に用いない場合には「null」と指定します。
第四引数はデータベースのバージョンを整数で指定しますが、
「1」から始める必要があるようです。
データベースを作り直す際に、例えば、
これまでのデータベースをバージョン「0」、
新規データベースをバージョン「1」とする、のように整数を指定します。
これらの情報はフィールドに定義しておいたほうが管理しやすいでしょう。
サンプルアプリのDatabaseHelperクラスのフィールド
private static final String DATABASE_NAME = "kendb.db";
public static final String TABLE_NAME_KEN_TABLE = "ken_table";
private static final int DATABASE_VERSION = 1;
次に2つのメソッドの定義を見ていきます。
onCreateメソッドはデータベースが最初に作成された時に1度呼び出され、
その際にテーブルの作成などを行います。
Googleの定義より、
Called when the database is created for the first time.
サンプルのDatabaseHelperクラスでは次のように定義しました。
SQLiteDatabaseオブジェクトのexecSQLメソッドは
引数で受け取ったSQLを実行します。
このメソッドは内部で自動的に呼び出されます。
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(create_table);
}
サンプルではテーブル作成用のSQLはDatabaseHelperクラスの
フィールドに定義してあります。
private final String create_table = "CREATE TABLE IF NOT EXISTS "+
TABLE_NAME_KEN_TABLE + "(" +
"user_id integer primary key autoincrement," +
"nickname text," +
"comment text)";
続いてonUpgradeメソッドですが、このメソッドは
データベース更新時にデータベースを新規作成し、
更新する時に自動的に呼び出されます。
そのため処理内容としては
テーブルの削除、追加作成、新規作成、その他の処理を行います。
Googleの定義より、
Called when the database needs to be upgraded.
The implementation should use this method to drop tables, add tables,
or do anything else it needs to upgrade to the new schema version.
サンプルのDatabaseHelperクラスでは次のように定義しました。
「ken_table」が存在していた場合それを削除しテーブルを再作成しています。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS ken_table");
onCreate(db);
}
このメソッドの第二引数と第三引数にはデータベースのバージョンを表す
整数値を指定します。
新しいバージョンは整数値の「1」以上を指定しなければならないため、
今回のサンプルでは第二引数の値には「0」を、
第三引数には「1」を指定しています。
DBActivityクラスより、
btn3.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
helper.onUpgrade(helper.getWritableDatabase(), 0, 1);
}
});
ボタンクリック時にonUpgradeメソッドを実行しています。
第一引数には書き込みモードを
指定したデータベースオブジェクトに入れています。
データベースオブジェクトは読み取りモードと書き込みモードを指定して
作成することができ、データベースに対して
表の作成やデータの挿入を行う際には書き込みモードを指定します。
最後にデータの挿入を見てみましょう。
DBActivityクラスより抜粋
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues inputData = new ContentValues();
inputData.put("nickname", name);
inputData.put("comment", cm);
db.insert("ken_table", null, inputData);
db.close();
挿入するデータはContentValuesオブジェクトのputメソッドを呼び出し、
第一引数に列名、第二引数に挿入するデータを指定します。
そしてデータベースオブジェクトのinsertメソッドを呼び出し、
第一引数にはテーブル名、第二引数は挿入対象ではない列に対する初期値、
第三引数にContenValuesオブジェクトを指定します。
この第二引数に関してですが、挿入データを含む新規の行は、
完全に何らかの値を有していないといけないようです。
つまり、ContentValuesオブジェクトに指定しなかった列に対しては
データが挿入されないわけですから、その場合明示的に
「null」の初期値を与えなければならないようです。
Googleの定義より、
SQL doesn't allow inserting a completely empty row,
so if initialValues is empty this column will explicitly be assigned a NULL value
いかがだったでしょうか。
今回はSQLiteデータベースの基本仕様を説明しました。
AndroidアプリではSQLiteは重宝されていますので、
必ず押さえておいてくださいね。
--------------------------------------------------------------------------------
パソコンスクール KENスクール北千住校 Programインストラクター
http://www.kenschool.jp/school/kitasenju/index.html
KENスクールでAndroidアプリを開発したい方は、Program講座へ!
http://www.kenschool.jp/Program/index.html
- 次の記事へ: Android特集 第16回 GalaxyTab購入レポート
- 前の記事へ: パソコンが壊れる前に
