Próbuję generalizować strukturę klasy.
Pokażę moją prawdziwą strukturę, aby była bardziej szczegółowa.W jaki sposób generować klasę za pomocą T i listy <T>
Piszę aplikacji w trybie offline, wsparcia, więc postanowiłem realizować moje ETag mechanizm cache w użyciu Robospice i GreenDao ORM.
Potrzebuję buforować tylko żądań GET.
pierwsze moje prośby należy rozszerzyć żądania bazową (nie moje), w moim przypadku RetrofitSpiceRequest<T, V>
T is type of return data
V is service type, in my case I am using Retrofit.
Problemem jest to, że typ zwracany jest nie List of T
rodzaje domyślnie i trzeba utworzyć podklasę, która rozciąga tablicę T obiekty i używają go jako typu zwracającego.
coś takiego
public class City {
....
....
....
public static class List extends ArrayList<City> {
.....
.....
}
}
I używać City.List jako typ zwracany.
Ale mam mój DAO zadeklarowana następująco
public class CityDao extends AbstractDao<City, Long> {
}
Na każde żądanie (GET) muszę mieć konkretny DAO jako członka w celu buforowania danych, jeśli różni się on od danych serwera. Lub załaduj dane z lokalnej bazy danych, jeśli nie ma połączenia.
Problem polega na tym, że żądanie generowane przez typ T, który jest w większości listą, City.List w moim przypadku, niektórych obiektów, ale moje dao jest generowane przez, na przykład typ E, który jest miastem w moim przypadku.
Chcę utworzyć metodę tak
public AbastractDao<T,Long> getRequestDao() {
}
Ale jeśli chodzi o moją prośbę wraca City.List, nie mam pojęcia, jak generify tej klasy, czuję, że to jest możliwe, ale teraz nie ma pomysły .
W przypadku braku metody dao generycznego, muszę powielić kod jak ten
@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();
}
}
W każdym żądaniu
Proszę podzielić się swoimi pomysłami.
Dzięki.
Czy dobrze rozumiem to prawo, chcesz swoje usługi automatycznie wstrzyknąć i wywołać odpowiednią Dao? –
Tak, ale problem polega na tym, że Dao jest rozszerzony AbstractDao i najczęściej używany jako AbstractDao gdzie T jest typem odwzorowanym na tabelę w moim przypadku miasta, ale muszę uzyskać listę miast, o ile żądanie zwraca obiekt klasa TI musi utworzyć niestandardową klasę MyCityList rozszerzającą ArrayList i tutaj jest problem. –
CROSP