【问题标题】:How to store an ArrayList or a HashMap to a file or in SharedPreferences?如何将 ArrayList 或 HashMap 存储到文件或 SharedPreferences 中?
【发布时间】:2015-09-30 00:36:33
【问题描述】:

我进行了搜索,但未能找到适合我的问题的解决方案。 我正在从服务器接收数据并显示它,我希望将这些数据存储在本地,最好是在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
             */
        }
    }
}

【问题讨论】:

    标签: android json file sharedpreferences


    【解决方案1】:

    SharedPreferences 不能只存储原始类型,所以你不能用它来存储Collection。您可以使用序列化将其写入您的内部存储,但它可能会变得棘手。我建议您将JSONObject/JSONArray(结果是您的情况)存储在SharedPreferences 中为String

    【讨论】:

    • 我将 jarray 存储在 SharedPreference 中?
    • 结果超过 jArray。请记住 jArray.toString() 等于 result
    • 我应该使用什么方法来存储结果?
    • 我能够使用 putString 存储“结果”并使用 getString 检索,感谢您的帮助:)
    【解决方案2】:

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

    1. 你需要将你的对象转换成字符串格式,写入纯文本文件,稍后再读取。这比读取Json更快。
    2. 您可以将对象序列化为 JSON/Strings 形式并使用 sharedPreferences 来存储它。您可以使用 Gson 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2013-09-11
      • 2017-12-04
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多