2013-08-29 9 views
11

कैशिंग करने का सबसे अच्छा तरीका मेरा आवेदन न केवल ऑनलाइन बल्कि ऑफ़लाइन मोड में भी काम करना चाहिए। इसी कारण से मैं डेटा नकदी के लिए सबसे अच्छा तरीका खोजने पर विचार कर रहा हूं। मुझे स्टोर डेटा के लिए साझा पेंशन का उपयोग करना पसंद नहीं है, लेकिन एंड्रॉइड प्रलेखन में लिखा गया है प्राथमिकता मान के लिए अनुमत वर्णों में अधिकतम आकार 8192 है। मुझे नहीं पता कि यह ठीक है या नहीं? मैंने फ़ाइल कैशिंग या स्क्लाइट कैशिंग का उपयोग करने की कोशिश कर इस विचार से बाहर निकलने की कोशिश की।जेसन

तो आप क्या सोचते हैं कि सबसे अच्छा साझा प्रेरणा बनाम फ़ाइल कैशिंग या बनाम एसक्लाइट कैशिंग क्या है?

+1

SharedPreferences को हटाने के लिए एक फ़ाइल

new ReadWriteJsonFileUtils(context).deleteFile(file_name); 

को हटाने के लिए, और SQLite बड़े पैमाने पर डाटा के लिए: पढ़ने फ़ाइल के लिए। –

+0

आपके उपयोग के मामले के बारे में अधिक जानकारी के बिना जवाब देना असंभव है। फिर भी, यह कुछ डिग्री के लिए राय का विषय है। – Henry

+1

मान लें कि मेरे पास कुछ डेटा है (यानी शहर की सूची) मैं चाहता हूं कि मेरा एप्लिकेशन इस जेसन को बाद में उपयोग के लिए स्टोर करे यदि इंटरनेट कनेक्शन उपलब्ध न हो। – fish40

उत्तर

12

मैं व्यक्तिगत रूप से इसे निम्नलिखित तरीके से करना पसंद करता हूं। एक SQLite डेटाबेस बनाएं जो आपकी सामग्री को पकड़ सके। फिर, उपयोगकर्ता इंटरफ़ेस को सीधे एडाप्टर & सामग्री प्रदाता का उपयोग करके डेटाबेस पर बाध्य करें जो डेटा बदलते समय अधिसूचना भेजता है ताकि यूआई स्वयं अपडेट हो सके। समीकरण में अंतिम भाग सिंक्रनाइज़ेशन सेवा का कुछ रूप है जो सामग्री डाउनलोड करता है और इसे डेटाबेस को असीमित रूप से सहेजता है। इस तरह, आप अपने डेटा को बहुत आसानी से प्रबंधित कर सकते हैं क्योंकि यह सब एक ही स्थान पर है। आपके ऐप के लिए आपको एकमात्र हिस्सा पता लगाना होगा कि डेटाबेस से डेटा को अपडेट या निकालने का तरीका आप कैसे तय करते हैं।

Adapters

ContentProvider

Synchronization

+0

मैं एडाप्टर और सामग्री प्रदाता के बारे में सोच रहा हूं मैं अधिसूचना कैसे भेज सकता हूं? – fish40

+1

एक ContentProvider संदर्भ को कॉल करना चाहिए .getContentResolver()। सूचित करें बदलें (, शून्य); जब डेटा बदल दिया गया है। प्रश्न में गतिविधि तब इन परिवर्तनों के बारे में अधिसूचित होने के लिए ContentObserver का उपयोग करेगी। – metter

+0

यह बहुत अच्छा मुद्दा है। धन्यवाद। – fish40

0

आपकी आवश्यकता के आधार पर मैं SQLite डेटा बेस की अनुशंसा करता हूं।

चूंकि साझा वरीयता विन्यास भंडारण के लिए उपयुक्त है - अक्सर छोटे डेटा/तार।

फ़ाइल कैश का प्रबंधन करना मुश्किल है, इसलिए मैं SQLite की सिफारिश करता हूं - प्रबंधित करने में आसान और जन डेटा संग्रह करने की क्षमता।

प्रदर्शन को ध्यान में रखते हुए, यदि सूचकांक की संख्या उस विशाल नहीं है, तो SQLite डेटाबेस में स्वीकार्य प्रदर्शन होना चाहिए। जैसे फ़ाइल कैश से केवल कई एमएस धीमी है।

आप इन दोनों दृष्टिकोणों को एक साथ जोड़ सकते हैं। SQLite में संग्रहीत इंडेक्स-ऑफ़सेट के साथ यादृच्छिक एक्सेस फ़ाइल का उपयोग करें।

+0

आपके उत्तर के लिए धन्यवाद। प्रदर्शन के बारे में आप क्या कह सकते हैं? – fish40

+0

मेरा संपादित उत्तर देखें। – Robin

+0

आपके समर्थन @robin के लिए धन्यवाद। – fish40

14

सहेजें फ़ाइल के रूप में कैश निर्देशिका में json ....

सहेजें:

// Instantiate a JSON object from the request response 
JSONObject jsonObject = new JSONObject(json); 
// Save the JSONOvject 
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File(getCacheDir(),"")+"cacheFile.srl")); 
out.writeObject(jsonObject); 
out.close(); 

प्राप्त करें:

// Load in an object 
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(new File(getCacheDir(),"")+"cacheFile.srl"))); 
JSONObject jsonObject = (JSONObject) in.readObject(); 
in.close(); 
+3

@ क्रिस्टियाना 214 तक पहुंचने के लिए रूट किए गए फोन की आवश्यकता है, लेकिन जेसनोबजेक्ट तत्काल को हटाने और केवल स्ट्रिंग को कैश में लिखने के बजाय। और जब एक स्ट्रिंग पुनर्प्राप्त करें और एक JsonObject नहीं पुनर्प्राप्त करें। – Msmit1993

+0

पुनर्प्राप्त करते समय आप फ़ाइल कक्षा को दो बार क्यों बनाते थे? – Hoffie

0

मैं मोबाइल मेमोरी का इस्तेमाल किया है जो आवेदन पैकेज निर्देशिका कि नहीं निहित डिवाइस के द्वारा सुलभ नहीं हो सकता है में दुकान फ़ाइल।

यहाँ

वर्ग जो, फ़ाइल

public class ReadWriteJsonFileUtils { 
    Activity activity; 
    Context context; 

    public ReadWriteJsonFileUtils(Context context) { 
     this.context = context; 
    } 

    public void createJsonFileData(String filename, String mJsonResponse) { 
     try { 
      File checkFile = new File(context.getApplicationInfo().dataDir + "/new_directory_name/"); 
      if (!checkFile.exists()) { 
       checkFile.mkdir(); 
      } 
      FileWriter file = new FileWriter(checkFile.getAbsolutePath() + "/" + filename); 
      file.write(mJsonResponse); 
      file.flush(); 
      file.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String readJsonFileData(String filename) { 
     try { 
      File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/" + filename); 
      if (!f.exists()) { 
       onNoResult(); 
       return null; 
      } 
      FileInputStream is = new FileInputStream(f); 
      int size = is.available(); 
      byte[] buffer = new byte[size]; 
      is.read(buffer); 
      is.close(); 
      return new String(buffer); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     onNoResult(); 
     return null; 
    } 

    public void deleteFile() { 
     File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/"); 
     File[] files = f.listFiles(); 
     for (File fInDir : files) { 
      fInDir.delete(); 
     } 
    } 

    public void deleteFile(String fileName) { 
     File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/" + fileName); 
     if (f.exists()) { 
      f.delete(); 
     } 
    } 
} 
बनाने पढ़ सकते हैं और हटा सकते हैं

आप पढ़ सकते हैं और इस प्रकार ReadWriteJsonFileUtils वर्ग तरीकों को फोन करके फ़ाइल को नष्ट, बना सकते हैं:

फ़ाइल बनाने के लिए :

try { 
    new ReadWriteJsonFileUtils(context).createJsonFileData(file_name, data); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

String jsonString = new ReadWriteJsonFileUtils(context).readJsonFileData(file_name); 

config डेटा के लिए सभी फ़ाइल

new ReadWriteJsonFileUtils(context).deleteFile();