【androidアプリ開発 No.18】SQLiteの使い方01

Pocket

久しぶりにandroidネタでいきます。

androidの端末内にデータを保持する場合、プリファレンス、ローカルファイル、データベースといった方法があります。
今回はデータベースについて記載していきます。

android以外の開発経験がある人にとってはお馴染みのデータベースですが、
androidの場合はSQLiteというデータベース管理システムが備わっています。

MySqlなど他の言語でSQLを操作したことがある人にとって、
一番最初に疑問が発生するのはCreate Tableをアプリ内で行うということではないでしょうか!!

他のサイトでSQLiteの使い方を載せてるところは結構多いのですが、
Create Tableをアプリ内で行うことを明示的に書いているところが少なく、
「テーブルはどうやって作るの??」と思っている人が多いようです。
※私もそうでした。。。固定概念はおそるべし。

Webサービスの開発では、DB用のサーバがあって、WebサービスからDBに接続することが一般的だと思いますが、
androidアプリのように端末で完結する場合は事前にDBを用意することが出来ない為、
アプリ内でテーブルを作る必要があります。
※APIでDBサーバと連携する場合は別ですが。。。

今回はアプリ内でテーブルを作成するサンプルコードを記載いたします。
今回重要になってくるのはSQLiteOpenHelperというヘルパークラスです。
このクラスは、データベースの作成やデータベースデータベースのバージョンアップ時にonUpgradeを呼び出します。

データベースのバージョンアップですが、通常のWebサイトの場合は仕様変更等で
カラムが追加された場合はDBサーバに対して変更のSQLを投げればいいのですが、
androidの場合は端末にDBがあり、一工夫しないといけません。
その際に利用するのがonUpgradeですが、これに関してはまた
別の機会に説明しようと思います。
※androidでカラム追加などする場合は、個人個人の端末になるので、人によってはバージョン1からバージョン3など
 一気に上げた場合の工夫が必要です。
 また、既に登録されているデータを壊さないように注意が必要です。
 バージョンアップの度にデータが飛ぶとかまじでありえないですから。。。

さて、話が長くなりましたが、コードを書いていきます。

/src/com.example.sample_sql.db/DatabaseHelper.java

色々なところで呼べるような作りにしておきます。

package com.example.sample_sql.db;

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

/**
 * SQLite処理Helper
 */
public class DatabaseHelper {


	// Databaseバージョン
	private static final int DATABASR_VERSION = 1;

	// Databaseファイル名
	private static final String DATABASE_FILE_NAME = "SAMPLE.db";

	private DatabaseOpenHelper mDbOpenHelper;
	private SQLiteDatabase mDb;

	/**
	 * コンストラクタ
	 * @param context
	 */
	public DatabaseHelper(Context context) {
		mDbOpenHelper = new DatabaseOpenHelper(context, DATABASE_FILE_NAME, null, DATABASR_VERSION);
	}

	/**
	 * DBオープン
	 */
	public void openWrite() {
		// データベースのオープン
		mDb = mDbOpenHelper.getWritableDatabase();
	}

	/**
	 * Close
	 */
	public void close() {
		mDbOpenHelper.close();
	}

	/**
	 * データベースオープン用のヘルパー
	 */
	private class DatabaseOpenHelper extends SQLiteOpenHelper {

		/**
		 * コンストラクタ
		 * @param context
		 * @param dbName
		 * @param factory
		 * @param version
		 */
		public DatabaseOpenHelper(Context context, String dbName, CursorFactory factory, int version) {
			super(context, dbName, factory, version);
		}

		/**
		 * DB生成
		 */
		@Override
		public void onCreate(SQLiteDatabase db) {

			// サンプルテーブルの作成
			db.execSQL(
				"CREATE TABLE sample_table ("
				+ "_id integer primary key autoincrement,"
				+ "name text not null, "
				+ "biko text"
				+ ")"
			);
		}

		/**
		 * バージョンアップ
		 */
		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// 今回は特に何もしません。
		}
	}

}

/src/com.example.sample_sql/MainActivity.java

起動時にDBが作成される作りにしています。

package com.example.sample_sql;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

// SQLite用のヘルパー
import com.example.sample_sql.db.DatabaseHelper;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    protected void onResume(){
    	super.onResume();

    	// データベースヘルパーのインスタンス生成
    	DatabaseHelper dbHelper = new DatabaseHelper(getApplicationContext());

    	// データベースのオープン(ここでDBとテーブルが作成される)
    	dbHelper.openWrite();
    	dbHelper.close();
	}
}

ソースコードを見てもらうとわかると思いますが、onCreateでテーブルを作成していますが、
これはデータベースを新規に作成した場合に呼ばれるので、何度もCreate Tableが呼ばれないようになっています。

最後にDBが作成されたか確認する方法ですが、
Windowsの場合、android-sdk/sdk/tools/ddms.batを実行すると
Guiが立ち上がるので、そこからエミュレート端末を選択し、Device->File Explorerを選択、
子画面が開くので「/data/data/対象アプリ/database/データベース名」が出来ていればOKです。

20130320_01

20130320_02



Post Footer automatically generated by Add Post Footer Plugin for wordpress.

びのっち

関東圏で活動しているとてもマイペースなSEです。

タグ: ,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*