如何将ArrayList或HashMap存储到文件或SharedPreferences中?

时间:2015-07-11 07:39:53

标签: android json file sharedpreferences

我已搜索过,但未能找到解决问题的正确方法。 我从服务器接收数据并显示它,我希望这些数据存储在本地,最好是SharedPreferences或文件 如果有Internet访问权限,则应存储和更新数据。 如果没有Internet访问权限,则应显示此数据。

以下是我的代码

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
             */
        }
    }
}

2 个答案:

答案 0 :(得分:1)

SharedPreferences无法仅存储基本类型,因此您无法使用它来存储Collection。您可以使用序列化将其写入内部存储,但它可能会变得棘手。我建议您将JSONObject / JSONArray(结果就是您的情况)存储在SharedPreferences String中。

答案 1 :(得分:0)

据我所知,有两种方法可以实现它。 如果你想存储一个特定的对象。

  1. 您需要将对象转换为字符串格式并将其写入纯文本文件并稍后阅读。阅读Json的速度更快。
  2. 您可以将对象序列化为JSON / Strings表单,并使用sharedPreferences存储它。您可以使用Gson库。