使用ORMlite for Android实现具有基本CRUD操作的通用模型

时间:2016-07-11 11:04:18

标签: java android ormlite

我有一些抽象类,我用它作为我所有模型的基础。为简单起见,我将仅讨论称为模型的根抽象类 - 它需要处理一些重复的ORMLite操作。在每次操作之前,我需要对所有模型应用一些逻辑标准。所以关键是我可以在调用对象上实现保存,更新和删除,而不必重复代码。

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”,而这个指的是模型&lt; MODEL,CHILD&gt;

目前的解决方法如下:

// 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”对象而不是基类Model类?我试过施法,但这给了我一个警告,说它是一个未经检查的演员。

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

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

例如,这个project为模型类提供了一种优雅的方式来保存,更新,删除自身。但遗憾的是,它缺少ORMlite中我需要的功能,但由于需要对基本模型进行生成,我似乎无法让ORMlite在我的项目中执行相同的操作。

1 个答案:

答案 0 :(得分:0)

Ahhh为自己找到了一个很好的解决方案:)只需简单地实现一个这样的抽象方法:

abstract protected MODEL getThis();

以下是实施:

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

然后每当我需要这个表现得像我正在使用的子类的这个时那样:

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