androidannotations + ormlite Activityからビジネスロジックを完全に切り離す!

1.pom.xmlにormliteの設定を追記

    <!-- ormlite -->
    <dependency>
      <groupId>com.j256.ormlite</groupId>
      <artifactId>ormlite-android</artifactId>
      <version>4.25</version>
    </dependency>  

2.永続化対象のオブジェクトを作成
てきとーに。。。

@DatabaseTable
public class SampleBean {

	@DatabaseField(generatedId = true)
	public int id;
	
	@DatabaseField
	public String value;
}


3.interfaceの定義
serviceについて、詳しくはこちら

これもてきとー。

public interface SampleService {
	void save(SampleBean bean);
	SampleBean find(int id);
}

4.DatabaseHelperの実装
これも以前の記事を参照してね。

5.実装
contextをDIできるのでActivityを継承したり、変な手段でContextを渡す必要が無い!!
昔はContextの取得方法がわからなくてロジックの分離をあきらめてたよ。

public class SampleServiceImpl implements SampleService {
	// package-privateにしてはいけない。
	@Inject Context context;

	public void save(SampleBean bean) {
		try {
			Dao<SampleBean, Integer> dao =
					OpenHelperManager.getHelper(context).getDao(SampleBean.class);
			dao.create(bean);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public SampleBean find(int id) {
		try {
			Dao<SampleBean, Integer> dao =
					OpenHelperManager.getHelper(context).getDao(SampleBean.class);
			return dao.queryForId(id);
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
}

6.最後に
これだけで実行するとこんな例外発生しちゃいます。

java.lang.IllegalStateException: Could not find OpenHelperClass because none of its generic parameters extends OrmLiteSqliteOpenHelper: null

OpenHelperClassをManagerに登録しないといけないらしい。
どこでやるのが適切かまだわからないけど、ひとまずApplicationに以下のコードを追加。

public class SampleApplication extends RoboApplication {

	static {
		OpenHelperManager.setOpenHelperClass(DatabaseHelper.class);
	}