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を取得して・・・・となかなかに煩わしい。
とりあえず初回ということでこんなもんでしょうか。