Ich habe einige abstrakte Klassen, die ich als Basis für alle meine Modelle verwenden. Der Einfachheit halber werde ich nur über die abstrakte Wurzelklasse, Modell genannt, sprechen, die mit wiederholten ORMLite-Operationen umgehen muss. Vor jeder Crud-Operation musste ich bei allen Modellen einen logischen Standard anwenden. Der Punkt ist, dass ich ein Speichern, Aktualisieren und Löschen für das aufrufende Objekt implementieren kann, ohne den Code wiederholen zu müssen.Implementieren eines generischen Modells mit grundlegenden CRUD-Operation mit ORMLite für 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...
}
Der obige Code gibt mir einen Fehler, da die DAO die Unterklasse „MODEL“ erwartet, sondern diese bezieht sich auf Modell < MODEL, KIND >
Die Abhilfe zu diesem Künstler ist das folgende:
Zumindest reduziere ich den Code für jedes der Modelle - aber es scheint immer noch nicht elegant. Gibt es eine Möglichkeit für mich, das "Dies" -Objekt der Unterklasse und nicht die Basismodellklasse zu greifen? Ich habe versucht, Casting, aber das gibt mir eine Warnung, dass es eine ungeprüfte Besetzung ist.
public void save() {
mRTEDao.create((MODEL)this);
}
public void delete() {
mRTEDao.delete((MODEL)this);
}
Diese project zum Beispiel hat eine elegante Art und Weise für die Modellklasse zu speichern, aktualisieren, löscht sich selbst. Aber leider fehlt es an Funktionen, die ich in ORMlite brauche, aber ich kann ORMLite anscheinend nicht dazu bringen, dasselbe in meinem Projekt zu tun, weil das Basismodell generisch sein muss.