greenDAOの使い方

今回は、AndroidのO/RマッパーであるgreenDAOに手を出してみる。

公式ページはこちら
http://greendao-orm.com/

greenDAOでは、Daoクラスの生成を、greendao-generatorというライブラリを用いて行う。

Daoを生成するために必要なライブラリは以下の3つ。
freemarker
greendao
greendao-generator


試しに作ってみた。

package net.atlabo.greendao.generator;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

public class GreenDaoGenerator {
	public static void main(String[] args) throws Exception {
		Schema schema = new Schema(1, "net.atlabo.webserviceapp.app.dao");
		addUserInfoEntity(schema);
		addHistorySummaryInfoEntity(schema);
		addHistoryInfoEntity(schema);
		addNewDetailInfoEntity(schema);
		new DaoGenerator().generateAll(schema, "./");
	}
	
	public static void addUserInfoEntity(Schema schema) {
		Entity entity = schema.addEntity("UserInfo");
		entity.addIdProperty().autoincrement();
		entity.addStringProperty("loginId").notNull();
		entity.addStringProperty("password").notNull();
	}
	
	public static void addNewDetailInfoEntity(Schema schema) {
		Entity entity = schema.addEntity("NewDetailInfo");
		entity.addIdProperty().autoincrement();
		entity.addDateProperty("useDate"); // 利用日
		entity.addStringProperty("user"); // 利用者
		entity.addStringProperty("contents"); // 利用内容
		entity.addStringProperty("kind"); // 利用区分
		entity.addLongProperty("useAmount"); // 利用額
		entity.addLongProperty("requestAmount"); // 請求額
		entity.addStringProperty("requestMonth"); // 請求月
	}
	
	public static void addHistorySummaryInfoEntity(Schema schema) {
		Entity entity = schema.addEntity("HistorySummaryInfo");
		entity.addIdProperty().autoincrement();
		entity.addDateProperty("depositDate").notNull().unique(); // お支払い日
		entity.addLongProperty("totalRequestAmount").notNull(); // 請求合計金額
	}
	
	public static void addHistoryInfoEntity(Schema schema) {
		Entity entity = schema.addEntity("HistoryDetailInfo");
		entity.addIdProperty().autoincrement();
		entity.addDateProperty("depositDate").notNull(); // お支払い日
		entity.addDateProperty("useDate"); // 利用日
		entity.addStringProperty("user"); // 利用者
		entity.addStringProperty("contents"); // 利用内容
		entity.addStringProperty("kind"); // 利用区分
		entity.addLongProperty("newAmount"); // 新規利用額
		entity.addLongProperty("requestAmount"); // 今回請求額
	}
}

上記コードを実行することで、
net/atlabo/webserviceapp/app/daoにDaoクラスとEntityクラスが出来上がる。
これをAndroidソースにコピーして使用する。

Androidソース

Androidの方では以下のようにして使用する。

package net.atlabo.webserviceapp.app;

import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import net.atlabo.webserviceapp.app.dao.DaoMaster;
import net.atlabo.webserviceapp.app.dao.DaoSession;
import net.atlabo.webserviceapp.app.dao.UserInfo;
import net.atlabo.webserviceapp.app.dao.UserInfoDao;

import roboguice.activity.RoboActivity;
import roboguice.inject.ContentView;
import roboguice.inject.InjectView;

/**
 * Created by ats337 on 2014/03/15.
 */
@ContentView(R.layout.setting)
public class SettingActivity extends RoboActivity {
    private DaoMaster.DevOpenHelper helper;

    @InjectView(R.id.loginid_text)
    private EditText loginIdText;

    @InjectView(R.id.password_text)
    private EditText passwordText;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        helper = new DaoMaster.DevOpenHelper(this, "webservice-db", null);

        // ユーザレコードを取得
        SQLiteDatabase db = helper.getReadableDatabase();
        DaoMaster master = new DaoMaster(db);
        DaoSession session = master.newSession();
        UserInfoDao userInfoDao = session.getUserInfoDao();
        long count = userInfoDao.count();
        if (count > 0) {
            // レコードが存在すればEditTextに値を設定
            UserInfo userInfo = userInfoDao.loadAll().get(0);
            loginIdText.setText(userInfo.getLoginId());
            passwordText.setText(userInfo.getPassword());
        }
    }

    /**
     * 設定完了ボタン押下時
     * @param view
     */
    public void onFinishSettingButton(View view) {
        // ログインID
        String loginId = loginIdText.getText().toString();
        // パスワード
        String password = passwordText.getText().toString();
        // 入力チェック
        if (loginId == null || "".equals(loginId)) {
            // TODO エラー
            return;
        }
        if (password == null || "".equals(password)) {
            // TODO エラー
            return;
        }

        UserInfo userInfo = new UserInfo();
        userInfo.setLoginId(loginId);
        userInfo.setPassword(password);

        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster master = new DaoMaster(db);
        DaoSession session = master.newSession();
        UserInfoDao userInfoDao = session.getUserInfoDao();

        // 件数を取得
        long count = userInfoDao.count();
        if (count == 0) {
            // レコードがなければInsert
            userInfoDao.insert(userInfo);
        } else {
            // レコードがあればUpdate
            userInfo.setId(userInfoDao.loadAll().get(0).getId());
            userInfoDao.update(userInfo);
        }

        // トースト出力
        Toast.makeText(this, "ユーザ登録を完了しました。", Toast.LENGTH_LONG).show();
        // Acitivityを終了
        finish();
    }
}

ユーザレコードを登録、更新、表示するプログラム。
登録は1件を前提とした作りになっているので、DBを使う必要はないのだけれど、サンプルということで。

ヘルパーを作って、SQLiteDatabase作ってDaoMaster、DaoSessionを作ってDaoを取得して・・・・となかなかに煩わしい。
とりあえず初回ということでこんなもんでしょうか。