如何在Android上扩展ORMLite的BaseDaoImpl类以扩展功能

时间:2011-11-25 19:55:50

标签: android sqlite ormlite

我想知道是否有办法在Android上扩展BaseDaoImpl类的ORMLite。在我的Android项目中,我使用几个不同的Dao对象来访问不同的业务对象。我的业务对象存储在不同的表中,并且都是从BusinessObject基类继承的,该基类具有两个成员Long id;Long objectId;,其中id是数据库中对象的真正唯一ID表

public abstract class BusinessObject{   

    public static final String ID_COLUMN_NAME = "_id";
    public static final String OBJECT_ID_COLUMN_NAME = "object_id";

    @SerializedName(value="_id")
    @DatabaseField(canBeNull=false, columnName = ID_COLUMN_NAME, generatedId=true)
    private int id;

    @SerializedName(value="id")
    @DatabaseField(canBeNull=false, columnName=OBJECT_ID_COLUMN_NAME, index=true, unique = true)    
    private long objectId;
}

现在我希望能够通过id和objectId删除业务对象。由于BaseDaoImpl类,当然已经可以删除id。为了能够通过objectId删除它们,我想到了扩展BaseDaoImpl类并向它添加泛型方法deleteByObjectId()方法。在方法中,我将使用dao的delete()方法删除对象,该方法采用PreparedDelete语句。

public class ExtendedDaoImple<T, ID> extends BaseDaoImpl<T, ID> implements ExtendedDao<T, ID> {

    protected ExtendedDaoImple(Class<T> dataClass) throws SQLException {
        super(dataClass);
    }

    public int deleteByObjectId(long objectId) throws SQLException {
        DeleteBuilder<T, ID> delBuilder = (DeleteBuilder<T, ID>) deleteBuilder();       
        delBuilder.where().eq(BusinessObject.OBJECT_ID_COLUMN_NAME, objectId).prepare();
        return delete(delBuilder.prepare());
    }
}

我的问题是我不知道如何从OrmLiteSqliteOpenHelper类创建ExtendedDaoImpl类的实例。通常,通过调用OrmLiteSqliteOpenHelper类的getDao()方法并传递Dao应该用于的BusinessObject类来创建Dao。例如。

Dao<Image, Long> imageDao = getDao(Image.class);

那么有没有办法修改OrmLiteSqliteOpenHelper类,以便可以检索ExtendedDaoImpl对象而不是BaseDaoImpl对象?

1 个答案:

答案 0 :(得分:20)

  

我的问题是我不知道如何从OrmLiteSqliteOpenHelper类创建ExtendedDaoImpl类的实例...

措辞严谨的问题。 @DatabaseTable注释有一个字段daoClass,可用于指定要构造的DAO类。

  

http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/table/DatabaseTable.html#daoClass()

以下是DaoManager的文档。

  

http://ormlite.com/docs/dao-manager

您的类需要有ConnectionSourceClass个参数的构造函数。

解决方案没有详细记录。如果您对如何改进文档有任何想法,请与我们联系。