2015-11-17 7 views
7

के साथ वर्ग कैसे उत्पन्न करें मैं अपनी कक्षा संरचना को उत्पन्न करने की कोशिश कर रहा हूं।
मैं अपनी वास्तविक संरचना को और अधिक विशिष्ट होने के लिए दिखाऊंगा।टी और सूची <T>

मैं ऑफलाइन मोड समर्थन के साथ आवेदन लिख रहा हूँ, इसलिए मैं Robospice और GreenDao ORM का उपयोग करने में मेरी ETag कैश तंत्र को लागू करने का फैसला किया।

मुझे केवल कैश करने की आवश्यकता है अनुरोध प्राप्त करें।

सबसे पहले मेरी अनुरोधों मेरे मामले में आधार अनुरोध (मेरा नहीं), विस्तार करना चाहिए RetrofitSpiceRequest<T, V>

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

समस्या यह है कि वापसी प्रकार डिफ़ॉल्ट रूप से प्रकार नहीं List of T है और मैं उपवर्ग कि टी की सरणी फैली बनाने की जरूरत वस्तुओं और जो इसे रिटर्न प्रकार के रूप में उपयोग करते हैं।

कुछ इस

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

} 

की तरह और वापसी प्रकार के रूप में City.List का उपयोग करें।

लेकिन मैं अपने डीएओ

public class CityDao extends AbstractDao<City, Long> { 

} 

निम्नलिखित प्रत्येक अनुरोध (GET) मैं अगर यह सर्वर डेटा से अलग कैश डेटा के क्रम में एक सदस्य के रूप में विशिष्ट डीएओ की आवश्यकता में के रूप में घोषित किया है। या यदि कोई कनेक्शन नहीं है तो स्थानीय डेटाबेस से डेटा लोड करें।

यहां समस्या यह है कि टी प्रकार द्वारा उत्पन्न अनुरोध जो अधिकतर सूची है, शहर। मेरे मामले में कुछ वस्तुओं के बारे में बताएं, लेकिन मेरे दाओ द्वारा उत्पन्न किया गया है, उदाहरण के लिए ई प्रकार जो मेरे मामले में शहर है।

मैं की तरह विधि बनाना चाहते हैं इस

public AbastractDao<T,Long> getRequestDao() { 

} 

लेकिन जहाँ तक मेरी अनुरोध के रूप में वापस City.List, मैं पता नहीं कैसे इस वर्ग generify करने के लिए है, मुझे लगता है कि यह संभव है, लेकिन अब कोई विचार ।
गैर सामान्य दाव विधि के मामले में, मैं इस

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

की तरह कोड नकल करने प्रत्येक अनुरोध

कृपया में अपने विचारों को साझा किया है।

धन्यवाद।

+0

आप अपनी सेवाओं को स्वचालित रूप से इंजेक्षन और उचित दाव कॉल करना चाहते हैं मैं यह सही समझ में आया? –

+0

हां, लेकिन समस्या यह है कि दाओ को सारदाडो का विस्तार किया जाता है और अधिकांशतः सारदादाओ के रूप में उपयोग किया जाता है जहां टी प्रकार मेरे मामले शहर में तालिका में मैप किया जाता है, लेकिन मुझे शहरों की सूची प्राप्त करने की आवश्यकता होती है, जहां तक ​​अनुरोध ऑब्जेक्ट देता है कक्षा टीआई को कस्टम क्लास बनाना है MyCityList ArrayList बढ़ाता है और यहां समस्या है। – CROSP

उत्तर

2

मैं निम्नलिखित समाधान के साथ समाप्त होता हूं। यह उतना अच्छा नहीं है जितना मैं चाहता था, लेकिन यह कोड को डुप्लिकेट करने से बेहतर और बेहतर काम करता है।

मेरा मूल अनुरोध वर्ग।

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; 
    } 
} 

और मैं इस वर्ग का विस्तार कर सकते

सार्वजनिक वर्ग NewsRequest फैली BaseGetRequest { सार्वजनिक स्थिर अंतिम स्ट्रिंग TARGET_URL = "/ समाचार"; न्यूज़ आर्टिकलडाओ एमएन्यूज आर्टिकलडाओ;

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

ग्रेट सॉल्यूशन मैन – ketazafor

संबंधित मुद्दे