2016-05-25 15 views
0

抽象クラスを作成して、すべてのクラスに重複したコードを書くことを避けるために、 IRepository任意のエンティティモデルのGreenDAOで基本的なCRUDを処理する抽象クラスを作成する方法

public abstract class DBStore<T> implements IRepository { 
    DaoMaster daoMaster; 
    Class<T> entityClass; 

    public DBStore(DaoMaster daoMaster, Class<T> entityClass) { 
     this.daoMaster = daoMaster; 
     this.entityClass = entityClass; 
    } 

    @Override 
    public void add(Entity entity) { 
     DaoSession session = this.daoMaster.newSession(); 
     AbstractDao<?, ?> dao = session.getDao(this.entityClass); 
     dao.insert(entity); // cannot pass entity as parameter because insert() expects capture<?> 
    } 

    // Other CRUD methods 
} 

を実装して、私は構文が、私は、変数entityは何insert()を期待であることを指定するために使用すべきかを理解していません。

+1

AbstractDao - これら二つの一般的なのparamsは何ですか?論理的には、E - エンティティタイプとプライマリキータイプです - つまり、IntegerをPKとして使用する場合、AbstractDaoを宣言してください。 aviad

+1

DaoSessionはすでにこれをカバーしています。 DAOへのアクセスだけでなく、CRUDメソッドも提供します。 –

答えて

0

[OK]を私はDBStore<T extends Entity> implements IRepository<T> をspecifiyingし、キャストして働くそれを得たAbstractDao<?, ?>ここ

は完全なコードですAbstractDao<T, Long>へ:

public abstract class DBStore<T extends Entity> implements IRepository<T> { 
    DaoMaster daoMaster; 
    Class<T> entityClass; 

    public DBStore(DaoMaster daoMaster, Class<T> entityClass) { 
     this.daoMaster = daoMaster; 
     this.entityClass = entityClass; 
    } 

    @Override 
    public void add(T entity) { 
     this.getSession().insert(entity); 
    } 

    @Override 
    public T getById(long id) { 
     AbstractDao<T, Long> dao = this.getDao(); 
     return dao.load(id); 
    } 

    //other methods 

    protected AbstractDao<T, Long> getDao(){ 
     DaoSession session = this.daoMaster.newSession(); 
     return (AbstractDao<T, Long>) session.getDao(this.entityClass); 
    } 

    protected DaoSession getSession(){ 
     return this.daoMaster.newSession(); 
    } 
} 
関連する問題