2015-01-14 29 views
5

मैंने JSON सफलतापूर्वक पार्स किया है लेकिन अब मैं इसे ऑफ़लाइन उपयोग के लिए कैश करना चाहता हूं, यहां तक ​​कि इंटरनेट भी उपलब्ध नहीं है, और यदि कोई नई प्रविष्टि आती है तो मैं उसे कैश करना चाहता हूं।ऑफ़लाइन उपयोग के लिए पार्स किए गए JSON को कैश कैसे करें

और डेटा कैश करने का सबसे अच्छा विकल्प क्या होगा? SharedPreferences या SQLite database

यहाँ मेरी कोड है, जो मैं JSON पार्स करने के लिए उपयोग कर रहा हूँ है:

public class MainActivity extends Activity { 

    ArrayList<Actors> actorsList; 
    ActorAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     actorsList = new ArrayList<Actors>(); 
     new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"); 

     ListView listview = (ListView)findViewById(R.id.list); 
     adapter = new ActorAdapter(getApplicationContext(), R.layout.row, actorsList); 

     listview.setAdapter(adapter); 

     listview.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
        long id) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(), actorsList.get(position).getName(), Toast.LENGTH_LONG).show();    
      } 
     }); 
    } 


    class JSONAsyncTask extends AsyncTask<String, Void, Boolean> { 

     ProgressDialog dialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      dialog = new ProgressDialog(MainActivity.this); 
      dialog.setMessage("Loading, please wait"); 
      dialog.setTitle("Connecting server"); 
      dialog.show(); 
      dialog.setCancelable(false); 
     } 

     @Override 
     protected Boolean doInBackground(String... urls) { 
      try { 

       //------------------>> 
       HttpGet httppost = new HttpGet(urls[0]); 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(httppost); 

       // StatusLine stat = response.getStatusLine(); 
       int status = response.getStatusLine().getStatusCode(); 

       if (status == 200) { 
        HttpEntity entity = response.getEntity(); 
        String data = EntityUtils.toString(entity); 


        JSONObject jsono = new JSONObject(data); 
        JSONArray jarray = jsono.getJSONArray("actors"); 

        for (int i = 0; i < jarray.length(); i++) { 
         JSONObject object = jarray.getJSONObject(i); 

         Actors actor = new Actors(); 

         actor.setName(object.getString("name")); 
         actor.setDescription(object.getString("description")); 

         actorsList.add(actor); 
        } 
        return true; 
       } 

       //------------------>> 

      } catch (ParseException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return false; 
     } 

     protected void onPostExecute(Boolean result) { 
      dialog.cancel(); 
      adapter.notifyDataSetChanged(); 
      if(result == false) 
       Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 

     } 
    } 

} 
+1

इसे एक फ़ाइल में सहेजें? – Skynet

उत्तर

7

क्यों नहीं बस इसे अपने एप्लिकेशन का कैश फ़ोल्डर में कुछ इस तरह का उपयोग कर बचाने के लिए:

String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator; 
File dir = new File(path); 
if (!dir.exists()) { 
    dir.mkdirs(); 
} 
path += "data"; 
File data = new File(path); 
if (!data.createNewFile()) { 
    data.delete(); 
    data.createNewFile(); 
} 
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data)); 
objectOutputStream.writeObject(actorsList); 
objectOutputStream.close(); 

और बाद, आप का उपयोग कर किसी भी समय में यह पढ़ सकते हैं:

List<?> list = null; 
File data = new File(path); 
try { 
    if(data.exists()) { 
     ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data)); 
     list = (List<Object>) objectInputStream.readObject(); 
     objectInputStream.close(); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

अद्यतन: ठीक है, ऑब्जेक्ट ToFileUtil नामक वर्ग बनाएं, इस कोड को बनाए गए वर्ग

package <yourpackagehere>; 

import android.os.Environment; 

import java.io.*; 

public class ObjectToFileUtil { 

    public static String objectToFile(Object object) throws IOException { 
     String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator; 
     File dir = new File(path); 
     if (!dir.exists()) { 
      dir.mkdirs(); 
     } 
     path += "data"; 
     File data = new File(path); 
     if (!data.createNewFile()) { 
      data.delete(); 
      data.createNewFile(); 
     } 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data)); 
     objectOutputStream.writeObject(object); 
     objectOutputStream.close(); 
     return path; 
    } 

    public static Object objectFromFile(String path) throws IOException, ClassNotFoundException { 
     Object object = null; 
     File data = new File(path); 
     if(data.exists()) { 
      ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data)); 
      object = objectInputStream.readObject(); 
      objectInputStream.close(); 
     } 
     return object; 
    } 
} 
पर पेस्ट करें

< अपने पैकेज नाम में बदलें और WRITE_EXTERNAL_STORAGEAndroidManifest.xml को अनुमति देने के लिए मत भूलना। अपने MainActivity में क्षेत्र

private String dataPath; 

जोड़ सकते हैं और JSONAsyncTask वर्ग के अपने onPostExecute विधि

try { 
    actorsList = (ArrayList<Actors>)objectFromFile(dataPath); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

का उपयोग करके, अब आप जब चाहें actorsList फ़ाइल किसी भी समय से मिल का उपयोग कर सकते

protected void onPostExecute(Boolean result) { 
    dialog.cancel(); 
    adapter.notifyDataSetChanged(); 
    if(result) { 
     try { 
      dataPath = objectToFile(arrayList); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 
    } 
} 

करने की जगह यदि आप एप्लिकेशन को बंद करने के बाद फ़ाइल के पथ को सहेजना चाहते हैं तो आपको डेटापाथ स्ट्रिंग (और एप्लिकेशन स्टार्ट पर लोड) को सहेजना होगा, उदाहरण के लिए, SharedPreferences का उपयोग करना।

+0

मैंने आपके उत्तर को पढ़ लिया है और फ़ाइल उपयोग को समझ लिया है, क्या आप अपना कोड अपने साथ जोड़ सकते हैं? .. तो मैं इसे करने में सक्षम हूं या आपके पास जिथब पर कोई नमूना कोड है? – Sun

+0

यह मजाकिया है। आपने पहले सिर्फ एक विकल्प के लिए कहा था। फिर @doubledeath ने आपको आवश्यक सभी सही कोड लिखा है, ताकि आप इसे अपने ऐप में जिस तरह से पसंद कर सकें और अब भी आप उत्तर के बारे में शिकायत कर सकें ... ¬¬ – PFROLIM

+0

@Sun चेक अपडेट ऊपर और यदि प्रश्न होंगे, मुझे यहां बताएं। – doubledeath

0
And what would be the best option to cache data ? SharedPreferences or SQLite database 

कौन सा विशुद्ध रूप से डेटा आपके द्वारा प्राप्त किए पर आधारित है।

  1. यदि डेटा छोटा है, तो बिना संरचित डेटा Shared Pref का उपयोग करें।
  2. यदि डेटा बड़ा है, संरचित डेटा तो SQLite का उपयोग करें।

लेकिन पूरे डेटा को बेहतर स्टोर करने के लिए आप file concept का उपयोग कर सकते हैं। अपने कोड String data = EntityUtils.toString(entity);data में स्ट्रिंग डेटा को स्टोर करें, आपको फ़ाइल में सहेजना होगा। अगर सर्वर से डेटा में कोई भी परिवर्तन फ़ाइल में जोड़ता है। और इंटरनेट मौजूद नहीं होने पर डेटा पुनर्प्राप्त करें। उपरोक्त लिंक से फ़ाइल संचालन के लिए उदाहरण कोड प्राप्त करें।

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