Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

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

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

radiocat
Web系技術とAndroidアプリ開発が中心。スクラムマスターもやってます。 よろしくお願いします。
http://radiocat.hatenablog.com/
rakus
「IT技術で中小企業を強くします!」というミッションを掲げ、中小企業の業務効率化に貢献する複数のクラウドサービスを提供しているIT企業です。「楽楽精算」「メールディーラー」など、国内トップシェアを誇る複数のサービスを開発し、累計導入社数は5万社を超えています。次の時代の"楽"を創るための、まだ見ぬサービスや機能を生み出す取り組みは、今日も続いています。
https://www.rakus.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした