すべてのモデルのベースとして使用する抽象クラスがいくつかあります。わかりやすくするために、モデルと呼ばれるルート抽象クラスについてのみ説明します。これは、繰り返しのORMLite操作を処理する必要があります。各操作の前に、すべてのモデルにいくつかのロジック標準を適用する必要がありました。つまり、コードを繰り返しなくても、呼び出しオブジェクトに対して保存、更新、および削除を実装できるということです。ORMlite for Androidを使用した基本的なCRUD操作による汎用モデルの実装
abstract public class Model<MODEL extends Model, CHILD extends ChildModel> {
private final List<CHILD> mChildren = new ArrayList<>();
private Class<CHILD> mChildClass;
private Class<MODEL> mModelClass;
protected RuntimeExceptionDao<MODEL, Long> mRTEDao;
public Model(Class<MODEL> modelClass, Class<CHILD> childClass) {
this.mChildClass = childClass;
this.mModelClass = modelClass;
this.mRTEDao = App.getOpenHelper().getRTEDao(this.mModelClass);
}
// some codes omitted...
public void save() {
// Do something to the object before continuing
mRTEDao.create(this);
}
public void delete() {
// Do something to the object before continuing
mRTEDao.delete(this);
}
// some codes omitted...
}
DAOは、サブクラス「MODEL」を期待するが、代わりにこのは、現時点ではこれにモデル< MODEL、CHILD >
の回避策を参照しているため上記のコードは私にエラーを与えます
// some codes omitted...
abstract protected void handleUpdate(); // Let the subclass handle the create/update
abstract protected void handleDelete(); // Let the subclass handle the delete
public void save() {
// Do something to the object before continuing
handleUpdate();
}
public void delete() {
// Do something to the object before continuing
handleDelete();
}
// some codes omitted...
少なくとも私はそれぞれのモデルのコードを減らしていますが、まだエレガントではありません。サブクラスの "this"オブジェクトを取得する方法がありますが、ベースモデルクラスではありませんか?私はキャストしようとしましたが、それはチェックされていないキャストであると私に警告します。例えば
public void save() {
mRTEDao.create((MODEL)this);
}
public void delete() {
mRTEDao.delete((MODEL)this);
}
これprojectは、保存更新、自身で削除するモデルクラスのためのエレガントな方法があります。しかし残念ながら、ORMliteには必要な機能がありませんが、ベースモデルを生成する必要があるため、ORMliteに自分のプロジェクトで同じことをすることはできません。ここで
abstract protected MODEL getThis();
は実装です::
@Override
protected ExampleModel getMe() {
return this;
}
その後、私はのように振る舞うようにこのを必要なとき