Как расширить класс ORMLite BaseDaoImpl на Android для расширения функциональности
Мне интересно, есть ли способ расширить BaseDaoImpl класс ORMLite на 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(). Внутри метода я удаляю объект, используя метод 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());
}
}
Моя проблема в том, что я не знаю, как создать экземпляр класса ExtendedDaoImpl из класса OrmLiteSqliteOpenHelper. Обычно Dao создается путем вызова метода getDao() класса OrmLiteSqliteOpenHelper и передачи класса BusinessObject, к которому должен использоваться Дао. Например.
Dao<Image, Long> imageDao = getDao(Image.class);
Итак, есть способ изменить класс OrmLiteSqliteOpenHelper таким образом, чтобы объекты ExtendedDaoImpl могли быть извлечены вместо объекта BaseDaoImpl?
Ответы
Ответ 1
Моя проблема в том, что я не знаю, как создать экземпляр класса 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
.
Решение плохо документировано. Дайте мне знать, если у вас есть идеи, как я могу улучшить документацию.