2016-07-11 13 views
0

すべてのモデルのベースとして使用する抽象クラスがいくつかあります。わかりやすくするために、モデルと呼ばれるルート抽象クラスについてのみ説明します。これは、繰り返しの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; 
} 

その後、私はのように振る舞うようにこのを必要なとき

答えて

0

ああは自分自身:)ただ単に、このような抽象メソッドを実装するための良い解決策を見つけましたサブタイトルの私は以下を使用しています:

public void save() { 
    // Do something to the object before continuing 
    mRTEDao.create(getThis()); 
} 

public void delete() { 
    // Do something to the object before continuing 
    mRTEDao.delete(getThis()); 
} 
関連する問題