Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to save List<Object> to SharedPreferences?

I have a list of products, which i retrieve from webservice, when app is opened for first time, app gets product list from webservice. I want to save this list to shared preferences.

    List<Product> medicineList = new ArrayList<Product>(); 

where Product class is:

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;     } } 

how i can save this List not requesting from webservice each time?

like image 263
kakajan Avatar asked Jan 23 '15 10:01

kakajan


2 Answers

It only possible to use primitive types because preference keep in memory. But what you can use is serialize your types with Gson into json and put string into preferences:

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(); } 

Extra Shot from below comment by @StevenTB

To Retrive

 public List<YourModel> getList(){     List<YourModel> arrayItems;     String serializedObject = sharedPreferences.getString(KEY_PREFS, null);      if (serializedObject != null) {          Gson gson = new Gson();          Type type = new TypeToken<List<YourModel>>(){}.getType();          arrayItems = gson.fromJson(serializedObject, type);      } } 
like image 122
ar-g Avatar answered Oct 08 '22 14:10

ar-g


You can use GSON to convert Object -> JSON(.toJSON) and JSON -> Object(.fromJSON).

  • Define your Tags with you want (for example):

    private static final String PREFS_TAG = "SharedPrefs"; private static final String PRODUCT_TAG = "MyProduct"; 
  • Get your sharedPreference to these tag's

    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; } 
  • Set your sharedPreferences

    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(); } 
  • If you want to save an array of Products, do this:

    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(); } 
like image 32
rafaelasguerra Avatar answered Oct 08 '22 15:10

rafaelasguerra