2011-11-25 152 views
14

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

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()方法。在该方法中,我将使用带有PreparedDelete语句的dao的delete()方法删除该对象。

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

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

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

那么,有修改在于ExtendedDaoImpl对象可以被检索到,而不是一个对象BaseDaoImpl这样的方式OrmLiteSqliteOpenHelper类的方法吗?

回答

20

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

奈斯利措辞问题。 @DatabaseTable批注的字段为daoClass,可用于指定要构建的DAO类。

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

这里是为DaoManager的文档。

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

你的类需要有一个构造带ConnectionSourceClass参数。

该解决方案没有很好的记录。如果您有任何想法可以改进文档,请告诉我。

+0

太棒了!完美的作品。再次感谢您的快速支持!你做得很好!我必须承认,我只是简单地看了一下文档,因为它真的很晚,显然我忽略了这一部分。阅读后,我认为它没有那么糟糕的记录。很明显,我找到它更加困难。 ;) – Flo

+0

有没有办法做到这一点与标准的JPA注释? – Buckstabue

+0

做什么@Buckstabue? ORMLite确实支持JPA注释的一个子集来标记这些类,但是android fu仍然是必需的。 – Gray