Я пытаюсь обобщить структуру своего класса.
Я покажу свою реальную структуру, чтобы быть более конкретным.
Я пишу приложение с поддержкой автономного режима, поэтому я решил реализовать свой механизм кэширования ETag с помощью Robospice и GreenDao ORM.
Мне нужно кэшировать только запросы GET.
Во-первых, мои запросы должны расширять базовый запрос (не мой), в моем случае RetrofitSpiceRequest<T, V>
T is type of return data
V is service type, in my case I am using Retrofit.
Проблема в том, что тип возвращаемого значения по умолчанию не является типом List of T
, и мне нужно создать подкласс, который расширяет массив объектов T и использует его как возвращаемый тип.
Что-то вроде этого
public class City {
....
....
....
public static class List extends ArrayList<City> {
.....
.....
}
}
И используйте City.List как возвращаемый тип.
Но мой DAO объявлен следующим образом
public class CityDao extends AbstractDao<City, Long> {
}
В каждом запросе (GET) мне нужно иметь определенный DAO в качестве члена, чтобы кэшировать данные, если они отличаются от данных сервера. Или загрузить данные из локальной базы данных, если нет подключения.
Проблема здесь в том, что запрос генерируется типом T, который в основном представляет собой список, City.List в моем случае, некоторых объектов, но мой дао генерируется, например, типом E, который в моем случае является City.
Я хочу создать такой метод
public AbastractDao<T,Long> getRequestDao() {
}
Но поскольку мой запрос возвращает City.List, я понятия не имею, как создать этот класс, я чувствую, что это возможно, но сейчас нет идей.
В случае неуниверсального метода дао мне нужно дублировать код, например это
@Override
public void insertReceivedData(City.List received) {
mCityDao.insertOrReplaceInTx(received);
}
@Override
public City.List getCachedData() {
if (mFilterMap != null && mFilterMap.size() > 0) {
return (City.List) mCityDao.loadAll();
} else {
WhereCondition[] whereConditions = QueryUtils.convertPropertyMapToConditionalArray(mFilterMap);
return (City.List) mCityDao.queryBuilder().where(whereConditions[0], Arrays.copyOfRange(whereConditions, 1, whereConditions.length)).list();
}
}
В каждом запросе
Пожалуйста, поделитесь своими идеями.
Спасибо.