Как расширить класс BaseDaoImpl ORMLite на Android для расширения функциональности - PullRequest
14 голосов
/ 25 ноября 2011

Мне интересно, есть ли способ расширить класс ORMLite BaseDaoImpl на Android. В моем проекте Android я использую несколько различных объектов Dao для доступа к различным бизнес-объектам. Мои бизнес-объекты хранятся в разных таблицах и все они наследуются от базового класса BusinessObject, который имеет два члена Long id; и Long objectId;, где 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. Чтобы иметь возможность удалить их также с помощью objectId, я подумал о расширении класса BaseDaoImpl и добавлении к нему универсального метода deleteByObjectId (). Внутри метода я бы удалил объект, используя метод delete () dao, который принимает инструкцию 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());
    }
}

Моя проблема в том, что я не знаю, как создать экземпляр класса ExtendedDaoImpl из класса OrmLiteSqliteOpenHelper . Обычно Dao создается путем вызова метода getDao () класса OrmLiteSqliteOpenHelper и передачи класса BusinessObject, для которого следует использовать Dao. Например.

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

Так есть ли способ изменить класс OrmLiteSqliteOpenHelper таким образом, чтобы объекты ExtendedDaoImpl могли быть получены вместо объекта BaseDaoImpl?

1 Ответ

20 голосов
/ 26 ноября 2011

Моя проблема в том, что я не знаю, как создать экземпляр класса 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

У вашего класса должен быть конструктор с аргументами ConnectionSource и Class.

Решение не очень хорошо документировано.Дайте мне знать, если у вас есть идеи, как я могу улучшить документацию.

...