Подтвердить что ты не робот

Как сохранить Hashmap для Android, чтобы он был повторно использован при перезапуске приложения с использованием общих настроек?

Я хочу сохранить hashmap для моего приложения для Android, которое при перезапуске отображает последние сохраненные значения hashmap.

HashMap<Integer,String> HtKpi=new HashMap<Integer,String>(); 

- моя хэшмап, и в ней динамически хранятся 44 значения. Это отлично работает!!! теперь я хочу сохранить его для будущего использования (перезапуск или повторное использование приложения).

4b9b3361

Ответ 1

Вы можете сериализовать его в json и сохранить полученную строку в настройках. Затем, когда перезапуск приложения получает строку из настроек и десериализует ее.

ИЗМЕНИТЬ:

Для этого вы можете, например, использовать Google Gson.

Вам нужно будет обернуть карту в класс:

public class MapWrapper {
  private HashMap<Integer, String> myMap;
  // getter and setter for 'myMap'
}

Чтобы сохранить карту:

Gson gson = new Gson();
MapWrapper wrapper = new MapWrapper();
wrapper.setMyMap(HtKpi);
String serializedMap = gson.toJson(wrapper);
// add 'serializedMap' to preferences

Чтобы получить карту:

String wrapperStr = preferences.getString(yourKey);
MapWrapper wrapper = gson.fromJson(wrapperStr, MapWrapper.class);
HashMap<Integer, String> HtKpi = wrapper.getMyMap(); 

Ответ 2

Сериализовать его и сохранить в общих настройках или в файле. Независимо от того, можете ли вы это сделать, конечно, зависит от типов данных, с которых сопоставляется и с. (Это не сработает, например, если вы попытаетесь сериализовать представление.)

Пример:

//persist
HashMap<String, Integer> counters; //the hashmap you want to save
SharedPreferences pref = getContext().getSharedPreferences("Your_Shared_Prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();    
for (String s : counters.keySet()) {
    editor.putInteger(s, counters.get(s));
}
editor.commit();


//load
SharedPreferences pref = getContext().getSharedPreferences("Your_Shared_Prefs", Context.MODE_PRIVATE);
HashMap<String, Integer> map= (HashMap<String, Integer>) pref.getAll();
for (String s : map.keySet()) {
        Integer value=map.get(s);
        //Use Value
}

Ответ 3

с помощью Raghav я создал полный рабочий пример:

public class AppCache {
public static HashMap<String, String> hashMap = null;

/* REPOSITORY NAME */
public static final String REPOSITORY_NAME = "HMIAndroid_System_Settings";

/* SETTINGS */
public static final String SETTING_PLANNED = "DATA_PLANNED";
public static final String SETTING_ACTUAL = "DATA_ACTUAL";
public static final String SETTING_ETA = "DATA_ETA";
public static final String SETTING_OR = "DATA_OR";
public static final String SETTING_LINEID = "LINEID";
public static final String SETTING_SERVERIP = "SERVERIP";

public static void LoadSettings(Context context) {
    SharedPreferences pref = context.getSharedPreferences(REPOSITORY_NAME, Context.MODE_PRIVATE);
    hashMap = (HashMap<String, String>) pref.getAll();
    if(hashMap == null) {
        hashMap = new HashMap<String, String>();
    }
}

public static void SaveSettings(Context context) {
    if(hashMap == null) {
        hashMap = new HashMap<String, String>();
    }

    //persist
    SharedPreferences pref = context.getSharedPreferences(REPOSITORY_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = pref.edit();
    for (String s : hashMap.keySet()) {
        editor.putString(s, hashMap.get(s));
    }
    editor.commit();
}
}

Затем в вашем onCreate загрузите его:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //load settings
    AppCache.LoadSettings(getApplicationContext());
    Log.d("onCreate","My LineID=" + AppCache.hashMap.get(AppCache.SETTING_LINEID));
    Log.d("onCreate","Dest ServerIP=" + AppCache.hashMap.get(AppCache.SETTING_SERVERIP));
}

в любое время в любом месте настроек обновления приложения:

AppCache.hashMap.put(AppCache.SETTING_LINEID, "1");
AppCache.hashMap.put(AppCache.SETTING_SERVERIP, "192.168.1.10");

в настройках сохранения onDestroy для кеширования:

@Override
protected  void onDestroy() {
    //save settings
    AppCache.SaveSettings(getApplicationContext());
}

Ответ 4

   @Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
}

Вы можете сохранить его здесь... Этот метод вызывается до того, как действие может быть убито, так что, когда он вернется через некоторое время в будущем, он сможет восстановить свое состояние.

И тогда вы можете отступить отсюда,

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
}

Этот метод вызывается после onStart(), когда активность повторно инициализируется из ранее сохраненного состояния, указанного здесь в файле savedInstanceState...

Я думаю, что это поможет

Ответ 5

У меня есть решение. То же самое, что я сделал в своем приложении, где я хотел сохранить имя состояний в качестве ключа и аббревиатуры состояния как значения. Для этого объявлен массив строк в "res/values ​​/string.xml". Вот код, используемый для объявления массива:

 <string-array name="array_string">
    <item>yourKey1;yourValue1</item>
    <item>yourKey2;yourValue2</item>
    <item>yourKey3;yourValue3</item>
</string-array>

И после этого, где вы хотите создать экземпляр своего хэш файла, сделайте следующее:

HashMap<String, String> map = new HashMap<String, String>();
    Resources res = getResources();

    String[] stringArray = res.getStringArray(R.array.array_string);

    //R.array.array_string is the name of your array declared in string.xml
    if(stringArray == null || stringArray.length == 0) return;

    for(String string : stringArray) {
        String[] splittedString = string.split(";");
        if(splittedString.length > 0) {
            String key = splittedString[0];
            String value = splittedString[1];
            map.put(key, value);
        }
    }

Теперь у вас есть готовый к использованию экземпляр HaspMap. Это простой способ сделать это, который я предпочитаю.