How to Cache Json data to be available offline?

android, java, json, offline

Solution

You have two ways. Either you create a database and save all of the data there and retrieve it back when you want to. Or if the data you have is not that much and you don't want to deal with databases, then you write the json string to a text file in the memory card and read it later when you are offline.

And for the second case, every time you go online, you can retrieve the same json from your web service and over write it to the old one. This way you can be sure that you have the latest json saved to the device.

Problem

I have parsed the JSON Data in a `listview` and now I want to make it available offline. Is there a way to save the JSON data at the phone so that you can see the data if your phone is offline? Does someone knows an example? EDIT works now: ``` public class MainActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new TheTask().execute(); } class TheTask extends AsyncTask<Void, Void, JSONArray> { InputStream is = null; String result = ""; JSONArray jArray = null; ProgressDialog pd; @Override protected void onPostExecute(JSONArray result) { super.onPostExecute(result); pd.dismiss(); ArrayList<String> list= new ArrayList<String>(); try { for(int i=0;i<result.length();i++) { JSONObject jb = result.getJSONObject(i) ; String name = jb.getString("name")+" "+jb.getString("Art"); list.add(name); } } catch(Exception e) { e.printStackTrace(); } setListAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list)); } @Override protected void onPreExecute() { super.onPreExecute(); pd = ProgressDialog.show(MainActivity.this, "State", "Loading...", true); } @Override protected JSONArray doInBackground(Void... arg0) { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("***"); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); } catch (Exception e) { Log.e("log_tag", "Error in http connection " + e.toString()); } // Convert response to string try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result = sb.toString(); writeToFile(result); } catch (Exception e) { Log.e("log_tag", "Error converting result " + e.toString()); } try { jArray = new JSONArray(result); } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); } try { jArray = new JSONArray(readFromFile()); } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); } return jArray; } } private void writeToFile(String data) { try { OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("config.txt", Context.MODE_PRIVATE)); outputStreamWriter.write(data); outputStreamWriter.close(); } catch (IOException e) { Log.e("Exception", "File write failed: " + e.toString()); } } private String readFromFile() { String ret = ""; try { InputStream inputStream = openFileInput("config.txt"); if ( inputStream != null ) { InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String receiveString = ""; StringBuilder stringBuilder = new StringBuilder(); while ( (receiveString = bufferedReader.readLine()) != null ) { stringBuilder.append(receiveString); } inputStream.close(); ret = stringBuilder.toString(); } } catch (FileNotFoundException e) { Log.e("login activity", "File not found: " + e.toString()); } catch (IOException e) { Log.e("login activity", "Can not read file: " + e.toString()); } return ret; } } ```

Original source

Related problems