2016-07-11 1 views
0

J'ai des classes abstraites que j'utilise comme base pour tous mes modèles. Par souci de simplicité, je ne parlerai que de la classe abstraite racine appelée model - qui doit gérer une opération ORMLite répétitive. Avant chaque opération crud, j'avais besoin d'appliquer une norme logique à tous les modèles. Donc le fait est que je peux implémenter une sauvegarde, une mise à jour et une suppression sur l'objet appelant, sans avoir à répéter le code.Implémentation d'un modèle générique avec une opération CRUD de base à l'aide d'ORMlite pour Android

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... 
} 

Le code me donne ci-dessus une erreur parce que le DAO attend la classe sous « modèle » mais ce fait référence à modèle < MODÈLE, ENFANT >

La solution à ce au moment est le ci-dessous:

// 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... 

À tout le moins je réduis le code pour chacun des modèles - mais il ne semble toujours pas élégant. Y at-il un moyen pour moi de saisir l'objet "this" de la sous-classe et non la classe Model de base? J'ai essayé de lancer, mais cela me donne un avertissement que c'est une distribution incontrôlée.

public void save() { 
    mRTEDao.create((MODEL)this); 
} 

public void delete() { 
    mRTEDao.delete((MODEL)this); 
} 

Ce project par exemple, a une manière élégante pour la classe modèle pour enregistrer, mettre à jour, supprimer sur elle-même. Mais malheureusement, il manque des fonctionnalités dont j'ai besoin dans ORMlite, mais je n'arrive pas à faire ORMlite faire la même chose dans mon projet en raison de la nécessité de générer le modèle de base.

Répondre

0

Ahhh trouvé une bonne solution pour moi-même :) simplement mettre en œuvre simplement une méthode abstraite comme ceci:

abstract protected MODEL getThis(); 

est ici la mise en œuvre:

@Override 
protected ExampleModel getMe() { 
    return this; 
} 

Alors chaque fois que je besoin ce à se comporter comme cette de la sous-classe J'utilise:

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()); 
}