AndroidでORマッピングできるOrmLiteの使い方



# 1.OrmLiteとは

Androidが標準でサポートしているSQLiteでORマッピングできるライブラリです。

本家サイト
http://ormlite.com/

導入のメリットは一般的なORマッピングによって受ける恩恵と同じですが、元々あまり複雑なことができないSQLiteなのに基本的なSQLをゴリゴリしなければならない煩わしさから開放されるという点で効果が大きいです。

# 2.環境設定

本家のダウンロードページからcoreとandroidのjarファイルをダウンロードします。

http://ormlite.com/releases/

ormlite-core-x.xx.jar
ormlite-android-x.xx.jar

androidプロジェクトのライブラリ設定でjarを設定してください。

# 3.サンプルプログラム

入力した文字をテーブルに登録する簡単なサンプルプログラムで説明を進めます。

![device-2013-12-08-160622.png](https://qiita-image-store.s3.amazonaws.com/0/3324/79cf9f0b-87e1-44de-d52e-fdee12fc3d38.png "サンプルプログラムの画面")

wordテーブルの定義は以下の通り。

| カラム | 型 | 備考 |
|:-----------|------------:|:------------:|
| id       |  INTEGER  |  AUTOINCREMENT       |
| value       | TEXT  | 入力値を保存        |

サンプルプログラムはGitHubに置いています。
https://github.com/radiocat/ormExample

# 4.Helperクラスの作成

com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelperを継承したHelperクラスを作成します。

**DatabaseHelperの作成例**

```java:DatabaseHelper.java
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

	private static final String DATABASE_NAME = "ormExample.db";
	private static final int DATABASE_VERSION = 1;

	public DatabaseHelper(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
		try {
			// エンティティを指定してcreate tableします
			TableUtils.createTable(connectionSource, Word.class);
		} catch (SQLException e) {
			Log.e(DatabaseHelper.class.getName(), "データベースを作成できませんでした", e);
		}
	}

	@Override
	public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i2) {
		// DBのアップグレード処理（今回は割愛）
	}
}
```

通常のandroid.database.sqlite.SQLiteOpenHelperなどを継承する場合と流れはほぼ同じですが、onCreateの中でcreate tableのSQL文を流すかわりにエンティティクラス（後述）を指定してTableUtils.createTableを実行します。


# 5.エンティティクラスの作成

Wordエンティティを作成します。
アノテーションの内容はだいたい想像できると思いますが詳細は以下のページで確認できます（英文）。
http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Local-Annotations

```java:Word.java
@DatabaseTable(tableName = "word")
public class Word {

	@DatabaseField(generatedId = true)
	private Integer id;
	@DatabaseField
	private String value;

	public Word() {
	}

	public Word(String value) {
		this.value = value;
	}

	public Integer getId() {
		return this.id;
	}

	public String getValue() {
		return this.value;
	}

	public void setValue(String value) {
		this.value = value;
	}
}
```

# 6.Modelクラスの作成

データ操作を行うModelクラスを作ります。

## 参照

Helperクラスからエンティティクラスを引数に指定したgetDaoメソッドを呼び出してDaoを生成し、ここでは全件取得するためのqueryForAllメソッドを呼び出しています。
基本的にはgetDaoしてDaoからエンティティを取得する流れです。

**wordテーブルの全件を取得するfindAllメソッド**

```java:WordModel.java（抜粋）
public List<Word> findAll() {
		DatabaseHelper helper = new DatabaseHelper(context);
		try {
			Dao<Word, Integer> dao = helper.getDao(Word.class);
			return dao.queryForAll();
		} catch (Exception e) {
			Log.e(TAG, "例外が発生しました", e);
			return null;
		} finally {
			helper.close();
		}
	}
```

## 更新系

流れは参照の時と同じでDaoから各操作を実行します。
ちなみにinsertを実行するメソッドはcreate、updateとdeleteは同じ名前のメソッドがあります。
データがなければinsert、あればupdateしたい場合にcreateOrUpdateというメソッドも用意されています。

**create or updateの例**

```java:WordModel.java抜粋
public void save(Word word) {
	DatabaseHelper helper = new DatabaseHelper(context);
	try {
		Dao<Word, Integer> dao = helper.getDao(Word.class);
		dao.createOrUpdate(word);
	} catch (Exception e) {
		Log.e(TAG, "例外が発生しました", e);
	} finally {
		helper.close();
	}
}
```


# 7.まとめ

以上、基本パターンはエンティティを定義してDaoからエンティティを操作する形でとても簡単な印象です。
Helperクラスにしろデータ操作にしろ基本的な流れはAndroid標準のSQLiteの実装方法を踏襲しつつ、SQLの実装部分のみが排除されているのでAndroid標準の実装からも乗り換えやすいのではないでしょうか。

実行速度など、パフォーマンス面が気になりますが、下記のブログで検証してされていたので参考までに載せておきます。

Androidで使えるOR Mapper: ORMLite
http://tech.naver.jp/blog/?p=516

データベースのアップグレード方法やユニットテストの書き方などはどうなるのか気になるところですが、それはまた次の機会に。