【问题标题】:How to extend the BaseDaoImpl class of ORMLite on Android to extend functionality如何在Android上扩展ORMLite的BaseDaoImpl类来扩展功能
【发布时间】:2011-11-25 19:55:50
【问题描述】:

我想知道是否有办法在 Android 上扩展 ORMLite 的 BaseDaoImpl 类。在我的 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 对象?

【问题讨论】:

    标签: android sqlite ormlite


    【解决方案1】:

    我的问题是我不知道如何从 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 参数的构造函数。

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

    【讨论】:

    • 太棒了!完美运行。再次感谢您的快速支持!你做得很好!我必须承认我只是快速浏览了文档,因为它真的很晚,显然我忽略了这一部分。读完之后,我认为它的记录并没有那么糟糕。显然,我更难找到它。 ;)
    • 有没有办法使用标准的 JPA 注释来做到这一点?
    • 做什么@Buckstabue? ORMLite 确实支持 JPA 注释的子集来标记类,但仍然需要 android fu。
    • @Gray 我的意思是可以在不使用 ormlite 注释但使用 JPA 注释的情况下为实体指定 dao 类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多