Как сохранить Список <Объект> в SharedPreferences?
У меня есть список продуктов, которые я извлекаю из webservice, когда приложение открыто в первый раз, приложение получает список продуктов из webservice. Я хочу сохранить этот список для общих настроек.
List<Product> medicineList = new ArrayList<Product>();
где класс продукта:
public class Product {
public final String productName;
public final String price;
public final String content;
public final String imageUrl;
public Product(String productName, String price, String content, String imageUrl) {
this.productName = productName;
this.price = price;
this.content = content;
this.imageUrl = imageUrl;
}
}
как я могу сохранить этот список, не запрашивая каждый раз от webservice?
Ответы
Ответ 1
Можно использовать только примитивные типы, поскольку предпочтение сохраняется в памяти. Но то, что вы можете использовать, сериализует ваши типы с помощью Gson в json и помещает строку в настройки:
private static SharedPreferences sharedPreferences = context.getSharedPreferences(STORE_FILE_NAME, Context.MODE_PRIVATE);
private static SharedPreferences.Editor editor = sharedPreferences.edit();
public <T> void setList(String key, List<T> list) {
Gson gson = new Gson();
String json = gson.toJson(list);
set(key, json);
}
public static void set(String key, String value) {
editor.putString(key, value);
editor.commit();
}
Ответ 2
Вы можете использовать GSON для преобразования Object → JSON (.toJSON) и JSON → Object (.fromJSON).
-
Определите теги, которые вы хотите (например):
private static final String PREFS_TAG = "SharedPrefs";
private static final String PRODUCT_TAG = "MyProduct";
-
Получите общий доступ к этим тегам
private List<Product> getDataFromSharedPreferences(){
Gson gson = new Gson();
List<Product> productFromShared = new ArrayList<>();
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE);
String jsonPreferences = sharedPref.getString(PRODUCT_TAG, "");
Type type = new TypeToken<List<Product>>() {}.getType();
productFromShared = gson.fromJson(jsonPreferences, type);
return preferences;
}
-
Задайте свои общие настройки
private void setDataFromSharedPreferences(Product curProduct){
Gson gson = new Gson();
String jsonCurProduct = gson.toJson(curProduct);
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(PRODUCT_TAG, jsonCurProduct);
editor.commit();
}
-
Если вы хотите сохранить массив продуктов. Вы делаете это:
private void addInJSONArray(Product productToAdd){
Gson gson = new Gson();
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE);
String jsonSaved = sharedPref.getString(PRODUCT_TAG, "");
String jsonNewproductToAdd = gson.toJson(productToAdd);
JSONArray jsonArrayProduct= new JSONArray();
try {
if(jsonSaved.length()!=0){
jsonArrayProduct = new JSONArray(jsonSaved);
}
jsonArrayProduct.put(new JSONObject(jsonNewproductToAdd));
} catch (JSONException e) {
e.printStackTrace();
}
//SAVE NEW ARRAY
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(PRODUCT_TAG, jsonArrayProduct);
editor.commit();
}
Ответ 3
В настоящее время у вас есть два варианта
a) Использование SharedPreferences
b) Используйте SQLite и сохраняйте значения.
Как выполнить поиск
a) Общие действия
Сначала сохраните свой список как набор, а затем преобразуйте его обратно в список, когда вы читаете из SharedPreferences.
Listtasks = new ArrayList<String>();
Set<String> tasksSet = new HashSet<String>(Listtasks);
PreferenceManager.getDefaultSharedPreferences(context)
.edit()
.putStringSet("tasks_set", tasksSet)
.commit();
Затем, когда вы прочтете это:
Set<String> tasksSet = PreferenceManager.getDefaultSharedPreferences(context)
.getStringSet("tasks_set", new HashSet<String>());
List<String> tasksList = new ArrayList<String>(tasksSet);
b) SQLite
Хороший учебник: http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/
Ответ 4
Все ответы, связанные с JSON, это Ok, но помните, что Java позволяет сериализовать любой объект, если вы реализуете интерфейс java.io.Serializable.
Таким образом вы можете сохранить его в настройках как сериализованный объект.
Ниже приведен пример сохранения в качестве настроек: https://gist.github.com/walterpalladino/4f5509cbc8fc3ecf1497f05e37675111
Надеюсь, это поможет вам как вариант.
Ответ 5
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
Для сохранения
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
Для получения
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
Ответ 6
В SharedPreferences вы можете хранить только примитивы.
Как один из возможных подходов состоит в том, что вы можете использовать GSON и хранить значения в настройках в JSON.
Gson gson = new Gson();
String json = gson.toJson(medicineList);
yourPrefereces.putString("listOfProducts", json);
yourPrefereces.commit();
Ответ 7
Вы можете сделать это, используя Gson
, как показано ниже:
- Загрузите
List<Product>
из webservice
- Преобразуйте
List
в Json String
с помощью new Gson().toJson(medicineList, new TypeToken<List<Product>>(){}.getType())
- Сохраните преобразованную строку в
SharePreferences
, как обычно.
Чтобы восстановить ваш List
, вам нужно вернуть процесс, используя метод fromJson, доступный в Gson
.
Ответ 8
Как сказано в принятом ответе, мы можем сохранить список объектов, таких как:
public <T> void setList(String key, List<T> list) {
Gson gson = new Gson();
String json = gson.toJson(list);
set(key, json);
}
public void set(String key, String value) {
if (setSharedPreferences != null) {
SharedPreferences.Editor prefsEditor = setSharedPreferences.edit();
prefsEditor.putString(key, value);
prefsEditor.commit();
}
}
Получите его, используя:
public List<Company> getCompaniesList(String key) {
if (setSharedPreferences != null) {
Gson gson = new Gson();
List<Company> companyList;
String string = setSharedPreferences.getString(key, null);
Type type = new TypeToken<List<Company>>() {
}.getType();
companyList = gson.fromJson(string, type);
return companyList;
}
return null;
}