2015-11-17 18 views
7

Sto provando a generare la mia struttura di classe.
Mostrerò la mia vera struttura per essere più specifica.Come generare classe con T e List <T>

Sto scrivendo applicazioni con supporto modalità offline, così ho deciso di realizzare il mio meccanismo di cache ETag nell'uso Robospice e GreenDao ORM.

Ho bisogno di cache solo GET richieste.

In primo luogo le mie richieste dovrebbero estendersi richiesta di base (non mia), nel mio caso RetrofitSpiceRequest<T, V>

T is type of return data 
V is service type, in my case I am using Retrofit. 

Il problema è che tipo di ritorno non è List of T tipi di default e ho bisogno di creare sottoclasse che si estende serie di T oggetti e che lo usano come tipo di ritorno.

Qualcosa di simile

public class City { 
.... 
.... 
.... 
    public static class List extends ArrayList<City> { 
    ..... 
    ..... 
    } 

} 

E utilizzare City.List come tipo di ritorno.

ma ho i miei DAO dichiarato come segue

public class CityDao extends AbstractDao<City, Long> { 

} 

In ogni richiesta (GET) ho bisogno di avere DAO specifica come membro al fine di dati della cache se diversa dai dati del server. O carica i dati dal database locale se non c'è connessione.

Il problema qui è la richiesta generata dal tipo T che è principalmente lista, CityList nel mio caso, di alcuni oggetti, ma il mio dao è generato da, ad esempio, il tipo E che è Città nel mio caso.

Voglio creare metodo come questo

public AbastractDao<T,Long> getRequestDao() { 

} 

Ma per quanto riguarda la mia richiesta ritorna City.List, non ho idea di come generify questa classe, ritengo che sia possibile, ma ora senza idee .
In caso di metodo di dao non generica, devo duplicare il codice come questo

@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(); 
     } 
    } 

In ogni richiesta

prega di condividere le vostre idee.

Grazie.

+0

Ho capito questo diritto, si desidera che i servizi per iniettare e chiamare il corretto Dao automaticamente? –

+0

Sì, ma il problema è che Dao è estendere il Salto iniziale e principalmente utilizzato come AbstractDao dove T è il tipo che è mappato al tavolo nel mio caso città, ma ho bisogno di ottenere l'elenco delle città, per quanto riguarda la richiesta restituisce oggetto di classe TI deve creare una classe personalizzata MyCityList estende ArrayList e qui è il problema. – CROSP

risposta

2

Finisco con la seguente soluzione. Non è buono come volevo, ma funziona e meglio della duplicazione del codice.

La mia classe di richiesta di base.

public abstract class BaseGetRequest<L extends List<T>, T, V> extends RetrofitSpiceRequest<L, V> implements FilterableRequest { 
    // Context 
    protected Context mContext; 
    // Filter used in request and in queries 
    protected Map<Property, String> mFilterMap; 
    // Session provided Singletone 
    protected DaoSessionProvider mSessionProvider; 

    public BaseGetRequest(Class<L> clazz, Class<V> retrofitedInterfaceClass, Context context, Map<Property, String> filterMap) { 
     super(clazz, retrofitedInterfaceClass); 
     mContext = context; 
     mFilterMap = filterMap; 
     mSessionProvider = ((DaoSessionProvider) mContext.getApplicationContext()); 
     // TODO determine required retry count 
     setRetryPolicy(new RetryPolicy() { 
      @Override 
      public int getRetryCount() { 
       return 0; 
      } 

      @Override 
      public void retry(SpiceException e) { 

      } 

      @Override 
      public long getDelayBeforeRetry() { 
       return 0; 
      } 
     }); 
    } 

    protected WhereCondition[] getWhereConditions() { 
     return QueryUtils.convertPropertyMapToConditionalArray(mFilterMap); 
    } 

    public BaseGetRequestV2(Class<L> clazz, Class<V> retrofitedInterfaceClass, Context context) { 
     this(clazz, retrofitedInterfaceClass, context, null); 
    } 

    public abstract AbstractDao<T, Long> getDao(); 

    public abstract L createDataList(List<T> list); 

    public L getCachedData() { 
     if (mFilterMap != null && mFilterMap.size() > 0) { 
      WhereCondition[] whereConditions = getWhereConditions(); 
      return createDataList(getDao().queryBuilder().where(whereConditions[0], Arrays.copyOfRange(whereConditions, 1, whereConditions.length)).list()); 
     } else { 
      return createDataList(getDao().loadAll()); 
     } 
    } 

    public abstract L getData(); 

    @Override 
    public Map<Property, String> getFilterMap() { 
     return mFilterMap; 
    } 

    public Map<String, String> getStringMap() { 
     return QueryUtils.convertPropertyMapToString(mFilterMap); 
    } 

    @Override 
    public L loadDataFromNetwork() throws Exception { 
     L receivedData = null; 
     try { 
      receivedData = getData(); 
      WhereCondition[] conditions = getWhereConditions(); 
      getDao().queryBuilder().where(conditions[0],Arrays.copyOfRange(conditions, 1, conditions.length)).buildDelete().executeDeleteWithoutDetachingEntities(); 
      getDao().insertOrReplaceInTx(receivedData); 
     } catch (Exception ex) { 
      receivedData = getCachedData(); 
     } 
     return receivedData; 
    } 
} 

E posso estendere questa classe

public class NewsRequest estende BaseGetRequest { public static String target_url finale = "/ news"; NewsArticolo mNewsArticleDao;

public NewsRequest(Context context) { 
    this(context, null); 
} 

public NewsRequest(Context context, Map<Property, String> filterMap) { 
    super(NewsArticle.List.class, API.class, context, filterMap); 
    mNewsArticleDao = mSessionProvider.getDaoSession().getNewsArticleDao(); 
} 

@Override 
public AbstractDao<NewsArticle, Long> getDao() { 
    return mNewsArticleDao; 
} 

@Override 
public NewsArticle.List createDataList(List<NewsArticle> list) { 
    return new NewsArticle.List(list); 
} 

@Override 
public NewsArticle.List getData() { 
    return getService().getNews(getStringMap()); 
} 

}

+0

Ottimo uomo di soluzioni – ketazafor

Problemi correlati