2015-10-19 185 views
0

我正在創建一個應用程序,在我的應用程序中,我得到的響應並將其置於自定義警報對話框中,直到此處工作正常,現在我所要做的是如果用戶從警報對話框中選擇一項,它應該存儲它優先選擇,因此不需要每次都讀取數據。如何將json對象存儲到共享首選項?

以下是我的代碼片段。

這我得到下面的響應是:

{ 
    "states": [ 
     { 
      "id": "1", 
      "state_slug": "agra", 
      "statename": "Agra" 
     }, 
     { 
      "id": "2", 
      "state_slug": "andaman_and_nicobar_islands", 
      "statename": "Andaman and Nicobar Islands" 
     }, 
     { 
      "id": "3", 
      "state_slug": "andhra_pradesh", 
      "statename": "Andhra Pradesh" 
     }, 
     { 
      "id": "4", 
      "state_slug": "arunachal_pradesh", 
      "statename": "Arunachal Pradesh" 
     }, 
     { 
      "id": "5", 
      "state_slug": "assam", 
      "statename": "Assam" 
     }, 
     { 
      "id": "6", 
      "state_slug": "bihar", 
      "statename": "Bihar" 
     }, 
     { 
      "id": "7", 
      "state_slug": "bulandshahr", 
      "statename": "Bulandshahr" 
     }, 
     { 
      "id": "8", 
      "state_slug": "chhattisgarh", 
      "statename": "Chhattisgarh" 
     }, 
     { 
      "id": "9", 
      "state_slug": "dadra_and_nagar_haveli", 
      "statename": "Dadra & Nagar Haveli" 
     }, 
     { 
      "id": "10", 
      "state_slug": "daman_and_diu", 
      "statename": "Daman & Diu" 
     }, 
     { 
      "id": "11", 
      "state_slug": "delhi", 
      "statename": "Delhi" 
     }, 
     { 
      "id": "12", 
      "state_slug": "farrukhabad", 
      "statename": "Farrukhabad" 
     }, 
     { 
      "id": "13", 
      "state_slug": "goa", 
      "statename": "Goa" 
     }, 
     { 
      "id": "14", 
      "state_slug": "gujarat", 
      "statename": "Gujarat" 
     }, 
     { 
      "id": "15", 
      "state_slug": "haryana", 
      "statename": "Haryana" 
     }, 
     { 
      "id": "16", 
      "state_slug": "himachal_pradesh", 
      "statename": "Himachal Pradesh" 
     }, 
     { 
      "id": "17", 
      "state_slug": "jammu_and_kashmir", 
      "statename": "Jammu & Kashmir" 
     }, 
     { 
      "id": "18", 
      "state_slug": "jharkhand", 
      "statename": "Jharkhand" 
     }, 
     { 
      "id": "19", 
      "state_slug": "karnataka", 
      "statename": "Karnataka" 
     }, 
     { 
      "id": "20", 
      "state_slug": "kerala", 
      "statename": "Kerala" 
     }, 
     { 
      "id": "21", 
      "state_slug": "lakshadweep", 
      "statename": "Lakshadweep" 
     }, 
     { 
      "id": "22", 
      "state_slug": "madhya_pradesh", 
      "statename": "Madhya Pradesh" 
     }, 
     { 
      "id": "23", 
      "state_slug": "maharashtra", 
      "statename": "Maharashtra" 
     }, 
     { 
      "id": "24", 
      "state_slug": "manipur", 
      "statename": "Manipur" 
     }, 
     { 
      "id": "25", 
      "state_slug": "meghalaya", 
      "statename": "Meghalaya" 
     }, 
     { 
      "id": "26", 
      "state_slug": "mizoram", 
      "statename": "Mizoram" 
     }, 
     { 
      "id": "27", 
      "state_slug": "nagaland", 
      "statename": "Nagaland" 
     }, 
     { 
      "id": "28", 
      "state_slug": "orissa", 
      "statename": "Orissa" 
     }, 
     { 
      "id": "29", 
      "state_slug": "pondicherry", 
      "statename": "Pondicherry" 
     }, 
     { 
      "id": "30", 
      "state_slug": "punjab", 
      "statename": "Punjab" 
     }, 
     { 
      "id": "31", 
      "state_slug": "purulia", 
      "statename": "Purulia" 
     }, 
     { 
      "id": "32", 
      "state_slug": "rajasthan", 
      "statename": "Rajasthan" 
     }, 
     { 
      "id": "33", 
      "state_slug": "sikkim", 
      "statename": "Sikkim" 
     }, 
     { 
      "id": "34", 
      "state_slug": "tamil_nadu", 
      "statename": "Tamil Nadu" 
     }, 
     { 
      "id": "35", 
      "state_slug": "tripura", 
      "statename": "Tripura" 
     }, 
     { 
      "id": "36", 
      "state_slug": "uttar_pradesh", 
      "statename": "Uttar Pradesh" 
     }, 
     { 
      "id": "37", 
      "state_slug": "uttarakhand", 
      "statename": "Uttarakhand" 
     }, 
     { 
      "id": "38", 
      "state_slug": "west_bengal", 
      "statename": "West Bengal" 
     } 
    ] 
} 

我在我的警告對話框中顯示Statename的,

class LoadAllStates extends AsyncTask<String, String, ArrayList<HashMap<String,String>>> { 

      ArrayAdapter<String> adapterallstates ; 
     private ProgressDialog pDialog; 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       pDialog = new ProgressDialog(MainActivity.this); 
       pDialog.setMessage("Please wait.."); 
       pDialog.setIndeterminate(true); 
       // pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress)); 
       pDialog.setCancelable(true); 
       pDialog.show(); 

      } 
      protected ArrayList<HashMap<String,String>> doInBackground(String... args) { 
       ServiceHandler sh = new ServiceHandler(); 

       // Making a request to url and getting response 
       statedata = new ArrayList<HashMap<String, String>>(); 
       String jsonStr = sh.makeServiceCall(STATE_URL, ServiceHandler.GET); 

       Log.d("Response: ", "> " + jsonStr); 

       if (jsonStr != null) { 
        try { 
         JSONObject jsonObj = new JSONObject(jsonStr); 
         state_list = jsonObj.getJSONArray(COUNTRY_LIST); 

         // looping through All Contacts 
         for (int i = 0; i < state_list.length(); i++) { 
          JSONObject c = state_list.getJSONObject(i); 

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

          // adding each child node to HashMap key => value 
           map.put(STATE_SLG, c.getString(STATE_SLG)); 
          map.put(STATE_ID, c.getString(STATE_ID)); 
          map.put(STATE_NAME,c.getString(STATE_NAME)); 

          statedata.add(map); 

         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } else { 
        Log.e("ServiceHandler", "Couldn't get any data from the url"); 
       } 

       return statedata; 
      } 

      protected void onPostExecute(ArrayList<HashMap<String,String>> result) { 

       super.onPostExecute(result); 
       pDialog.dismiss(); 

       String[] arrallstates=new String[statedata.size()]; 
       for(int index=0;index<statedata.size();index++){ 
          HashMap<String, String> map=statedata.get(index); 
         arrallstates[index]=map.get(STATE_NAME); 
       } 


       // pass arrConuntry array to ArrayAdapter<String> constroctor : 
       adapterallstates = new ArrayAdapter<String>(MainActivity.this, 
            android.R.layout.simple_spinner_dropdown_item, 
                      arrallstates); 
       spstate.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View w) { 
          new AlertDialog.Builder(MainActivity.this) 
          .setTitle("Select") 
          .setAdapter(adapterallstates, new DialogInterface.OnClickListener() { 

          @Override 
          public void onClick(DialogInterface dialog, int which) { 

           spstate.setText(adapterallstates.getItem(which).toString()); 

           try { 

            String n = state_list.getJSONObject(which).getString("state_slug"); 


            statename=state_list.getJSONObject(which).getString("state_slug"); 
            stnm=state_list.getJSONObject(which).getString(STATE_NAME); 

            Log.d("Response statenm: ", "> " + statename); 

            SharedPreferences.Editor editor = sharedpreferences.edit(); 

             editor.putString(States, n); 
             editor.commit(); 
            new LoadAllStatesCity().execute(); 

            // Toast.makeText(getActivity(), statename, Toast.LENGTH_LONG).show(); 
           } catch (JSONException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 

           dialog.dismiss(); 
          } 
          }).create().show(); 
         } 
       }); 

      } 
    } 
+2

你可以寫在一個文件?比存儲一個json響應sp? – Dhina

+1

你想只存儲選定的值?或整個迴應? –

+1

你面臨的問題究竟是什麼? – Droidwala

回答

2

,如果你想存儲響應的更好的方法是編寫內容到一個文件中。如果你想只存儲一些值,你可以這樣做

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit(); 
editor.putString("key_from_json", "String_value_from_json"); 
editor.putInt("key_from_json","int_value_from_json"); 
editor.commit(); 
+0

是的,我改變了它..它幫助我..接受並投票了... –

0

SharedPreferences它優選用於存儲小數據。因此,以節省您的entire response最好是將其保存到一個文件中(例如:.bin),像這樣:

public static synchronized void saveToFileSystem(Context context, Object object, String binFileName) { 
     try { 
      String tempPath = context.getFilesDir() + "/" + binFileName + ".bin"; 
      File file = new File(tempPath); 
      ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); 
      oos.writeObject(object); 
      oos.flush(); 
      oos.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

和閱讀它,你可以做像水木清華:

public static synchronized Object readFromFileSystem(Context context, String binFileName) { 
     Object obj = new Object(); 
     try { 
      String tempPath = context.getFilesDir() + "/" + binFileName + ".bin"; 
      File file = new File(tempPath); 
      if (file.exists()) { 
       ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); 
       obj = ois.readObject(); 
       ois.close(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return obj; 
    } 
+0

請解釋..什麼這個bin文件? – learner

+0

@learner它只是一種文件。您可以使用任何其他文件類型。這只是一個例子 – hrskrs

+0

你也可以通過'Gson'將它轉換成'jsonString',反之亦然 – hrskrs

0

我存儲SharedPreferences中的一個鍵中的選定值。然後,在啓動時,您將能夠加載SharedPreferences來檢查您是否已經有值(在這種情況下,您可以完全重新加載您的JSON)

指南here

IMMO,如果你只是想要存儲一個值,保存文件是沒用的。這就是SharedPreferences應該被使用的地方:即使關閉應用程序並重新啓動它們,它們也會保留。

0

各州的數據不會改變多年,所以你可以保留這個json data in assets並從那裏使用它或保留在static map。而不是調用webservice來獲取它。

爲堅持選定的值,您可以使用SharedPreferences並在其中存儲狀態id。下一次,只要你充氣狀態列表,你可以檢查你的共享首選項,並選擇一個保存。

+0

你能幫我解決我的問題嗎? –

+0

你的答案? –

+0

我的意思是在我的代碼中,我得到並在對話框 –

0

基本上,你可以檢查是否存儲首選項的值。

你能做到這一點onCreate()方法:如果優先值存在

檢查是:

則沒有必要作出的AsyncTask調用
,如果沒有:
然後進行的AsyncTask調用

代碼:

String statename = preferences.getString("STATE_NAME<name you gave while committing for first time>,""); 
if(statename!=""){ 
    //Then directly go inside main activity 

} 
else{ 
//Make AsyncTask Call 

} 
+0

那麼如果第一個用戶想要更改呢? –

+0

抱歉,我沒有得到它,你說什麼意思? – Droidwala

+0

@Lakhan你的意思是問如何改變用戶設置的狀態? – Droidwala

0

可以使用 gson.jar file -> click here

,並使用存儲在您的整個對象類優先...

static public void setPreferenceObject(Context c, Object modal,String key) { 
    /**** storing object in preferences ****/ 
    SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(
      c.getApplicationContext()); 
    Editor prefsEditor = appSharedPrefs.edit(); 

    Gson gson = new Gson(); 
    String jsonObject = gson.toJson(modal); 
    prefsEditor.putString(key, jsonObject); 
    prefsEditor.commit(); 

} 

static public Object getPreferenceObjectJson(Context c,String key) { 

    SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(
      c.getApplicationContext()); 
    /**** get user data *****/ 
    String json = appSharedPrefs.getString(key, ""); 
    Gson gson=new Gson(); 
    User selectedUser=gson.fromJson(gsonString, User.class); 
    return selectedUser; 
} 
0

您可以將JSON文件輕鬆保存完全作爲一個字符串變量與鍵當你想再次閱讀時,共享偏好並進行分析。