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) // みたいな感じでアクティビティーからモデルを通して、データを扱う