OrmLiteをこんな感じに使うのはどうでしょうか?というお話

さらに追記
http://codedehitokoto.blogspot.jp/2012/01/sqlormliteandroid.html さんのほうがよいサンプルだと思います


追記
コメントをいただきました。そちらも参考にしてください
> vector さんご指摘ありがとうございます。近じかやって、それに応じて記事の修正もします
指摘内容は、まず記事中に close がないのと、close の呼び出しがあるので OrmLite モデルを継承して各モデルを作るより、直接各モデルで OrmLiteModel でやっていることを記述するほうがすっきりするとのことです


はじめに、Java についてはかなりド素人
色々と問題がありそうなので、やさしい目でご指摘ください。あと以下のソースは若干脳内のものが混ざっているのでそのまま使えないかも><


という保身の記載をしておいて、、、
Android で OrmLite を使用してアプリを少し作ってみたんですが、非常に使いやすい ORM だと思いました。もうすげーっていうくらい
一方で、OrmLiteBaseActivity というアクティビティーが Dao に密接すぎるんじゃないかとも感じましたので、以下のようにして OrmLite を使ってみたんだけどどうでしょうか?という内容のエントリー


したいこと

  • OrmLiteBaseActivity は使わず、アクティビティーと Dao を分離する


具体的にしたこと

  • OrmLiteBaseActivity は使わない
  • モデルを作る。そのモデルで OrmLiteBaseActivity で扱っていた Dao を扱う
  • それぞれのアクティビティーでモデルを通して、Dao というかデータベースの操作を行う


ということで

  • データソース
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

@DatabaseTable(tableName = "accounts")
public class Account {

	@DatabaseField(id = true)
	int id;
	@DatabaseField
	String name;
}
  • OrmLiteModel(これを継承してそれぞれのモデルを作る)
import android.content.Context;

import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;

public class OrmLiteModel<H extends OrmLiteSqliteOpenHelper> {
	private volatile H helper;

	@SuppressWarnings("unchecked")
	public OrmLiteModel(Context context) {
		helper = (H) OpenHelperManager.getHelper(context);
	}
	
	public H getHelper() {
		return helper;
	}
	
}
  • Account モデル
import java.sql.SQLException;
import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;

import android.content.Context;
import android.provider.SyncStateContract.Helpers;

public class AccountModel extends OrmLiteModel<DatabaseHelper> {

	private Dao<Account, Integer> accountDao;
	private DatabaseHelper helper;

	public AccountModel(Context context) {
                super(context);
		helper = getHelper(context);
		try {
			accountDao = helper.getAccountDao();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// save(Account account) や getAllAccounts() みたいな、データを扱うメソッドを色々作る

}
  • DatabaseHelper(ほとんどサンプルコードのまま)
import java.sql.SQLException;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;

/**
 * Database helper which creates and upgrades the database and provides the DAOs for the app.
 * 
 * @author kevingalligan
 */
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

	/************************************************
	 * Suggested Copy/Paste code. Everything from here to the done block.
	 ************************************************/

	private static final String DATABASE_NAME = "foobar";
	private static final int DATABASE_VERSION = 1;

	private Dao<Account, Integer> accountDao;

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

	/************************************************
	 * Suggested Copy/Paste Done
	 ************************************************/

	@Override
	public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) {
		try {
			TableUtils.createTable(connectionSource, Account.class);
		} catch (SQLException e) {
			Log.e(DatabaseHelper.class.getName(), "Unable to create datbases", e);
		}
	}	

	@Override
	public void onUpgrade(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource, int oldVer, int newVer) {
		try {
			TableUtils.dropTable(connectionSource, Account.class, true);
			onCreate(sqliteDatabase, connectionSource);
		} catch (SQLException e) {
			Log.e(DatabaseHelper.class.getName(), "Unable to upgrade database from version " + oldVer + " to new "
					+ newVer, e);
		}
	}

	public Dao<Account, Integer> getAccountDao() throws SQLException {
		if (accountDao == null) {
			accountDao = getDao(Account.class);
		}
		return accountDao;
	}

}
AccountModel accountModel = new AccountModel(this);
// accountModel.getAllAccounts()
// accountModel.save(account)
// みたいな感じでアクティビティーからモデルを通して、データを扱う