LoginSignup
42

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-12-14

1.OrmLiteとは

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

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

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

2.環境設定

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

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

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

3.サンプルプログラム

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

device-2013-12-08-160622.png

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

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

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

4.Helperクラスの作成

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

DatabaseHelperの作成例

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

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メソッド

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の例

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42