2015-10-19 182 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文件轻松保存完全作为一个字符串变量与键当你想再次阅读时,共享偏好并进行分析。