2015-07-11 75 views
1

我已經搜索,但一直沒能找到適合我的問題的解決方案。 我正在接收來自服務器的數據並顯示它,我希望將此數據存儲在本地,最好在SharedPreferences或文件 如果有Internet訪問,則應存儲和更新數據。 如果沒有互聯網訪問,則應顯示此數據。如何將ArrayList或HashMap存儲到文件或SharedPreferences中?

下面是我的代碼

package com.timetable; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.ObjectInputStream; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.Set; 

import org.apache.http.NameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ListActivity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ParseException; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MondayTimeTable_TE_Elex extends ListActivity { 
    // JSON Node names 
    private static String TAG_ID = "id"; 
    private static String TAG_NAME = "name"; 
    String FILENAME = "monday_te_elex_file"; 
    FileInputStream fis; 

    ListView listViewItem; 
    // contacts JSONArray 
    JSONArray monday_te_elex = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_monday_time_table_te_elex); 

     new PlaceOrder().execute(); 
     listViewItem = getListView(); 

    } 

    ArrayList<HashMap<String, String>> categoriesList; 

    class PlaceOrder extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 

      // TODO Auto-generated method stub 
      InputStream inputStream = null; 
      String result = null; 

      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      // Example for param : 
      // nameValuePairs.add(new BasicNameValuePair("id", 1)); 
      inputStream = Request.setHttpRequest(
        "http://asimmerchant.hostoi.com/TE/Elex/Monday/monday_te_elex.php", 
        nameValuePairs); 

      // Hashmap for ListView 
      categoriesList = new ArrayList<HashMap<String, String>>(); 

      if (inputStream != null) { 
       result = StringResponse.convertResponseToString(inputStream); 
       result = result.trim(); 
      } 

      if (result == null || result.equals("null")) { 
       System.out.println("Invalid request"); 

      } else { 

       try { 
        JSONArray jArray = new JSONArray(result); 
        JSONObject json_data = null; 
        for (int i = 0; i < jArray.length(); i++) { 
         json_data = jArray.getJSONObject(i); 

         try { 
          String id = json_data.getString(TAG_ID); 
          String name = json_data.getString(TAG_NAME); 

          // creating new HashMap 
          HashMap<String, String> map = new HashMap<String, String>(); 

          // adding each child node to HashMap key => value 
          map.put(TAG_ID, id); 
          map.put(TAG_NAME, name); 

          categoriesList.add(map); 

         } catch (ParseException e) { 
          e.printStackTrace(); 
         } 
        } 
       } catch (JSONException e1) { 
        Toast.makeText(getBaseContext(), "ERROR", Toast.LENGTH_LONG) 
          .show(); 
       } catch (ParseException e1) { 
        Toast.makeText(getBaseContext(), "Error", Toast.LENGTH_LONG) 
          .show(); 
       } 

      } 
      return null; 

     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      ListAdapter adapter = new SimpleAdapter(MondayTimeTable_TE_Elex.this, 
        categoriesList, R.layout.list, new String[] { TAG_NAME}, 
        new int[] { R.id.name }); 

      setListAdapter(adapter); 

      /** 
      * Selecting single ListView item 
      */ 
     } 
    } 
} 

回答

1

SharedPreferences不能只存儲原始類型,所以你不能用它來存儲一個Collection。你可以使用序列化將它寫在你的內部存儲上,但它可能會變得棘手。我建議您將JSONObject/JSONArray(結果是您的情況)作爲String存儲在SharedPreferences中。

+0

我在SharedPreference中存儲jarray嗎? –

+0

結果比jArray多。請記住,jArray.toString()等於結果 – Blackbelt

+0

我應該使用什麼方法來存儲結果? –

0

根據我有兩種方法來實現它。 如果你想存儲一個特定的對象。

  1. 您需要將對象轉換爲字符串格式並將其寫入純文本文件並稍後閱讀。閱讀Json甚至更快。
  2. 您可以將該對象序列化爲JSON /字符串形式,並使用sharedPreferences存儲它。您可以使用它的Gson庫。
相關問題