Можно ли добавить массив или объект в SharedPreferences на Android
-
28-09-2019 - |
Вопрос
У меня есть ArrayList
объектов, у которых есть имя и указатель на значок, и я хочу сохранить его в SharedPreferences
.Как я могу это сделать?
ПРИМЕЧАНИЕ:Я не хочу использовать базу данных
Решение
Итак, от сайта разработчика Android на Хранилище данных:
Пользовательские настройки
Общие предпочтения не строго для сохранения «пользовательских настроек», такие как то, что выбрал рингтон, выбрал пользователь. Если вы заинтересованы в создании пользовательских предпочтений для вашего приложения, см. ПредпочтениеCEActivity, которая предоставляет основы деятельности для создания пользовательских настроек, которые будут автоматически сохраняться (используя общие предпочтения).
Поэтому я думаю, что все в порядке, так как это просто просто пары ключевых ценностей, которые сохраняются.
К первоначальному плакату это не так сложно. Вы просто просто повторяете свой список массивов и добавляете элементы. В этом примере я использую карту для простоты, но вы можете использовать список массива и изменять его соответствующим образом:
// my list of names, icon locations
Map<String, String> nameIcons = new HashMap<String, String>();
nameIcons.put("Noel", "/location/to/noel/icon.png");
nameIcons.put("Bob", "another/location/to/bob/icon.png");
nameIcons.put("another name", "last/location/icon.png");
SharedPreferences keyValues = getContext().getSharedPreferences("name_icons_list", Context.MODE_PRIVATE);
SharedPreferences.Editor keyValuesEditor = keyValues.edit();
for (String s : nameIcons.keySet()) {
// use the name as the key, and the icon as the value
keyValuesEditor.putString(s, nameIcons.get(s));
}
keyValuesEditor.commit()
Вы сделаете что-то подобное, чтобы снова прочитать пары клавишных значений. Дайте мне знать, если это работает.
Обновлять: Если вы используете API уровня 11 или более поздней версии, есть метод Чтобы узнать набор строки
Другие советы
Независимо от уровня API, проверьте Струнные массивы и массивы объектов в SharedPreferences
Сохранить массив
public boolean saveArray(String[] array, String arrayName, Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(arrayName +"_size", array.length);
for(int i=0;i<array.length;i++)
editor.putString(arrayName + "_" + i, array[i]);
return editor.commit();
}
Массив нагрузки
public String[] loadArray(String arrayName, Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);
int size = prefs.getInt(arrayName + "_size", 0);
String array[] = new String[size];
for(int i=0;i<size;i++)
array[i] = prefs.getString(arrayName + "_" + i, null);
return array;
}
Написать,
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(this);
JSONArray jsonArray = new JSONArray();
jsonArray.put(1);
jsonArray.put(2);
Editor editor = prefs.edit();
editor.putString("key", jsonArray.toString());
System.out.println(jsonArray.toString());
editor.commit();
Читать,
try {
JSONArray jsonArray2 = new JSONArray(prefs.getString("key", "[]"));
for (int i = 0; i < jsonArray2.length(); i++) {
Log.d("your JSON Array", jsonArray2.getInt(i)+"");
}
} catch (Exception e) {
e.printStackTrace();
}
Общие предпочтения ввели getStringSet
и putStringSet
методы в API 11-го уровня, но это несовместимо со старыми версиями Android (которые все еще популярны), а также ограничено наборами строк.
Android не предоставляет лучших методов, и перебирать карты и массивы для их сохранения и загрузки не очень просто и чисто, особенно для массивов.Но улучшить реализацию не так уж и сложно:
package com.example.utils;
import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Context;
import android.content.SharedPreferences;
public class JSONSharedPreferences {
private static final String PREFIX = "json";
public static void saveJSONObject(Context c, String prefName, String key, JSONObject object) {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(JSONSharedPreferences.PREFIX+key, object.toString());
editor.commit();
}
public static void saveJSONArray(Context c, String prefName, String key, JSONArray array) {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(JSONSharedPreferences.PREFIX+key, array.toString());
editor.commit();
}
public static JSONObject loadJSONObject(Context c, String prefName, String key) throws JSONException {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
return new JSONObject(settings.getString(JSONSharedPreferences.PREFIX+key, "{}"));
}
public static JSONArray loadJSONArray(Context c, String prefName, String key) throws JSONException {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
return new JSONArray(settings.getString(JSONSharedPreferences.PREFIX+key, "[]"));
}
public static void remove(Context c, String prefName, String key) {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
if (settings.contains(JSONSharedPreferences.PREFIX+key)) {
SharedPreferences.Editor editor = settings.edit();
editor.remove(JSONSharedPreferences.PREFIX+key);
editor.commit();
}
}
}
Теперь вы можете сохранить любую коллекцию в общих настройках с помощью этих пяти методов.Работа с JSONObject
и JSONArray
это очень просто.Вы можете использовать JSONArray (Collection copyFrom)
открытый конструктор для создания JSONArray
из любой коллекции Java и использовать JSONArray
's get
методы доступа к элементам.
Для общих настроек нет ограничений по размеру (кроме ограничений по объему памяти устройства), поэтому эти методы могут работать в большинстве обычных случаев, когда вам нужно быстрое и удобное хранилище для какой-либо коллекции в вашем приложении.Но здесь происходит синтаксический анализ JSON, а настройки в Android хранятся внутри в виде XML-файлов, поэтому я рекомендую использовать другие механизмы постоянного хранения данных, когда вы имеете дело с мегабайтами данных.
Легкий режим для сложного хранения объектов с использованием библиотеки GSON Google [1
public static void setComplexObject(Context ctx, ComplexObject obj){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("COMPLEX_OBJECT",new Gson().toJson(obj));
editor.commit();
}
public static ComplexObject getComplexObject (Context ctx){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
String sobj = preferences.getString("COMPLEX_OBJECT", "");
if(sobj.equals(""))return null;
else return new Gson().fromJson(sobj, ComplexObject.class);
}
Я загрузил массив размеров талии (уже создан в моем файле Array.xml) в моих предпочтениях .xml файл с кодом ниже. @ Array / pant_inch_size - это идентификатор всего массива.
<ListPreference
android:title="choosepantsize"
android:summary="Choose Pant Size"
android:key="pantSizePref"
android:defaultValue="34"
android:entries="@array/pant_inch_size"
android:entryValues="@array/pant_inch_size" />
Это населело меню с вариантами из массива. Я установил размер по умолчанию на 34, поэтому, когда появится меню, они видят размер 34 размера 34.
Простой способ, чтобы преобразовать его в json строку как ниже пример:
Gson gson = new Gson();
String json = gson.toJson(myObj);
Затем храните строку в общих предпочтениях. После того, как вам нужно, просто получите строку от общих предпочтений и конвертировать обратно в JSONARRAY или JSONOBJECT (согласно вашему требованию.)
Для записи:
private <T> void storeData(String key, T data) {
ByteArrayOutputStream serializedData = new ByteArrayOutputStream();
try {
ObjectOutputStream serializer = new ObjectOutputStream(serializedData);
serializer.writeObject(data);
} catch (IOException e) {
e.printStackTrace();
}
SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0);
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putString(key, Base64.encodeToString(serializedData.toByteArray(), Base64.DEFAULT));
edit.commit();
}
Для чтения:
private <T> T getStoredData(String key) {
SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0);
String serializedData = sharedPreferences.getString(key, null);
T storedData = null;
try {
ByteArrayInputStream input = new ByteArrayInputStream(Base64.decode(serializedData, Base64.DEFAULT));
ObjectInputStream inputStream = new ObjectInputStream(input);
storedData = (T)inputStream.readObject();
} catch (IOException|ClassNotFoundException|java.lang.IllegalArgumentException e) {
e.printStackTrace();
}
return storedData;
}
Это код общих предпочтений, которые я успешно использую, обратитесь к этому связь:
public class MainActivity extends Activity {
private static final int RESULT_SETTINGS = 1;
Button button;
public String a="dd";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
button = (Button) findViewById(R.id.btnoptions);
setContentView(R.layout.activity_main);
// showUserSettings();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.settings, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_settings:
Intent i = new Intent(this, UserSettingActivity.class);
startActivityForResult(i, RESULT_SETTINGS);
break;
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_SETTINGS:
showUserSettings();
break;
}
}
private void showUserSettings() {
SharedPreferences sharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this);
StringBuilder builder = new StringBuilder();
builder.append("\n Pet: "
+ sharedPrefs.getString("prefpetname", "NULL"));
builder.append("\n Address:"
+ sharedPrefs.getString("prefaddress","NULL" ));
builder.append("\n Your name: "
+ sharedPrefs.getString("prefname", "NULL"));
TextView settingsTextView = (TextView) findViewById(R.id.textUserSettings);
settingsTextView.setText(builder.toString());
}
}
Счастливое кодирование!
Вы можете использовать Putstringset.
Это позволяет вам сохранить хеш-сайт в ваших предпочтениях, как это:
Сохранять
Set<String> values;
SharedPreferences sharedPref =
mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);
Editor editor = sharedPref.edit();
editor.putStringSet("YOUR_KEY", values);
editor.apply();
Отбрасывать
SharedPreferences sharedPref =
mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);
Editor editor = sharedPref.edit();
Set<String> newList = editor.getStringSet("YOUR_KEY", null);
Putstringset позволяет просто набор, и это неупорядоченный список.