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

Как сохранить Список <Объект> в 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?

4b9b3361

Ответ 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;
}