4

I have an ArrayList of custom POJO objects that I want to save to SharedPreferences so they don't get garbage collected and the user can still access them after the application is closed.

I have tried using GSON but I think there's something I'm missing which I can't see.The String my Object is converted to has been saved properly but nothing is stored in it.

I'm using this Click event to store:

cartBut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
            SharedPreferences mPrefs = getSharedPreferences("Cart", MODE_PRIVATE);
            SharedPreferences.Editor prefsEditor = mPrefs.edit();

            ArrayList<ItmModel> arrayList = new ArrayList<>();
            AtomicReference<ItmModel> itmModel = new AtomicReference<>(new ItmModel(item.getText().toString(), attr.getText().toString(),
                    pric.getText().toString(), sise.getText().toString(), image, company));
            arrayList.add(itmModel.get());

            Gson gson = new Gson();
            Type type = new TypeToken<ArrayList<ItmModel>>() {
            }.getType();
            String list = gson.toJson(arrayList, type);
            prefsEditor.putString("Cart", list);
            prefsEditor.apply();

        }
    });

and I'm retrieving it like this:

SharedPreferences sharedPreferences = getSharedPreferences("Cart", MODE_PRIVATE);
    Gson gson = new Gson();
    String list = sharedPreferences.getString("Cart", "");
    Type type = new TypeToken<ArrayList<ItmModel>>() {
    }.getType();
    arrayList = gson.fromJson(list, type);
    if (arrayList == null) {
        arrayList = new ArrayList<>();
    }

    final CrtAdapter crtAdapter = new CrtAdapter(arrayList);

    RecyclerView recyclerView = view.findViewById(R.id.recyclerView);
    recyclerView.setAdapter(crtAdapter);
    recyclerView.setHasFixedSize(true);
    recyclerView.setItemViewCacheSize(20);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setLayoutManager(linearLayoutManager);
    runLayoutAnimation(recyclerView);
    recyclerView.setOnFlingListener(null);

Despite all my attempts, the RecyclerView is always empty and when I check in my File explorer the Preference is empty like in this screenshotPic 1

and this

Pic 2

My POJO is both Parcelable and Serializable. What could I be doing wrong? I'll post any required code. Thank you.

This is what i'm getting from the logs in the click event.I see the object is added but later removed from the list.Why could that be happenig?

04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: create interp thread : stack size=128KB
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: create new thread
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: new thread created
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: update thread list
04-06 09:53:42.959 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: interp stack at 0x57bee000
04-06 09:53:42.959 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: created from interp
**04-06 09:53:42.960 4078-4078/kamble.gml.woodleyint D/dalvikvm: threadid=26: adding to list**
04-06 09:53:42.960 4078-4078/kamble.gml.woodleyint D/dalvikvm: start new thread
04-06 09:53:42.960 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: notify debugger
04-06 09:53:42.960 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26 (SharedPreferencesImpl-load): calling run()
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: exiting
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: detach (group=0x418d8ce0)
**04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: removing from list
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: bye!
04-06 09:53:43.143 4078-4078/kamble.gml.woodleyint D/Cart: [[]]**
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: create interp thread : stack size=128KB
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: create new thread
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: new thread created
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: update thread list
04-06 09:53:43.146 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: interp stack at 0x57bee000
04-06 09:53:43.146 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: created from interp
**04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: threadid=26: adding to list**
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: start new thread
04-06 09:53:43.152 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: notify debugger
04-06 09:53:43.152 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26 (pool-3-thread-1): calling run()

This is my POJO:

public class ItmModel extends ArrayList implements Parcelable, Serializable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<ItmModel> CREATOR = new Parcelable.Creator<ItmModel>() {
    @Override
    public ItmModel createFromParcel(Parcel in) {
        return new ItmModel(in);
    }

    @Override
    public ItmModel[] newArray(int size) {
        return new ItmModel[size];
    }
};
private String name;
private String attr;
private String size;
private String pric;
private String imag;
private String comp;

public ItmModel(String name, String attr, String size, String pric, String imag, String comp) {
    this.name = name;
    this.attr = attr;
    this.size = size;
    this.pric = pric;
    this.imag = imag;
    this.comp = comp;
}

public ItmModel() {

}

private ItmModel(Parcel in) {
    name = in.readString();
    attr = in.readString();
    size = in.readString();
    pric = in.readString();
    imag = in.readString();
    comp = in.readString();
}

public String getName() {
    return name;
}

public void setName(String companyName) {
    this.comp = companyName;
}

public String getAttr() {
    return attr;
}

public void setAttr(String attr) {
    this.attr = attr;
}

public String getSize() {
    return size;
}

public void setSize(String size) {
    this.size = size;
}

public String getPric() {
    return pric;
}

public void setPric(String pric) {
    this.pric = pric;
}

public String getImag() {
    return imag;
}

public void setImag(String imag) {
    this.imag = imag;
}

public String getComp() {
    return comp;
}

public void setComp(String comp) {
    this.comp = comp;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(name);
    dest.writeString(attr);
    dest.writeString(size);
    dest.writeString(pric);
    dest.writeString(imag);
    dest.writeString(comp);
}}
14
  • did you debug your code before prefsEditor.putString("Cart", list); Commented Apr 6, 2018 at 6:43
  • It's able to insert but seems like list is empty Commented Apr 6, 2018 at 6:45
  • @rajanks yeah but why does that happen?I have gone over the code and I think I got everything correct not so? Commented Apr 6, 2018 at 6:47
  • @jakeoliver let me do that right now.I'll get back to you Commented Apr 6, 2018 at 6:48
  • @jakeoliver I just edited my question Commented Apr 6, 2018 at 7:00

3 Answers 3

3

Try to remove AtomicReference and add item to list directly as in

ArrayList<ItmModel> arrayList = new ArrayList<>();
ItmModel itmModel = new ItmModel(item.getText().toString(), attr.getText().toString(),pric.getText().toString(), sise.getText().toString(), image, company);
arrayList.add(itmModel);

Gson gson = new Gson();
Type type = new TypeToken<ArrayList<ItmModel>>() {}.getType();
String list = gson.toJson(arrayList, type);
prefsEditor.putString("Cart", list);
prefsEditor.apply();

Why are you even extending ArrayList in POJO, remove and modify part of your POJO to below

public class ItmModel implements Parcelable, Serializable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<ItmModel> CREATOR = new Parcelable.Creator<ItmModel>() {
    @Override
    public ItmModel createFromParcel(Parcel in) {
        return new ItmModel(in);
    }

    @Override
    public ItmModel[] newArray(int size) {
        return new ItmModel[size];
    }
};
@Expose
private String name;
@Expose
private String attr;
@Expose
private String size;
@Expose
private String pric;
@Expose
private String imag;
@Expose
private String comp;
 //rest of code as it is
}
Sign up to request clarification or add additional context in comments.

9 Comments

I just tried that but it didnt work.The string is still empty
share your ItmModel POJO
Ill post it just now
posted the pojo
This worked sir.thanks so much.That was the problem.now everything is fine.Wish I could upvote twice
|
1

check this, it might help you

 private void savePinnedFeedsToPrefrence(int position) {
    PreferenceManager preferenceManager = new PreferenceManager(this);
    Gson gson = new Gson();
    String pinnedList = preferenceManager.getPinnedFeeds(AppConstants.PINNED_FEEDS);
    List<FootballFeed> pinnedFeedsList;
    if ("".contentEquals(pinnedList)) {
        pinnedFeedsList = new ArrayList<>();
    } else {
        pinnedFeedsList = gson.fromJson(pinnedList,
                new TypeToken<List<FootballFeed>>() {
                }.getType());
    }
    pinnedFeedsList.add(footballFeeds.get(position));
    preferenceManager.savePinnedFeeds(gson.toJson(pinnedFeedsList));
}

and these are my retrieving methods,

 public void savePinnedFeeds(String value) {
    editor.putString(AppConstants.PINNED_FEEDS, value);
    editor.commit();
}
public String getPinnedFeeds(String key) {
    return sharedPreferences.getString(AppConstants.PINNED_FEEDS, "");
}

2 Comments

Let me look into it
Sadly it didn't work and I found the answer.The problem was in my pojo.Thanks for the response however
1
To save custom array list you need to follow bellow step:
step 1: You need to creat cutom bean class.
public class Bean {

    String name,number;

    public Bean(String name,String number){
        this.name=name;
        this.number=number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}

step 2: You need to create function to save array list to SharedPreferences.

public void saveArrayList(ArrayList<Bean> list, String key) {

        SharedPreferences prefs = getSharedPreferences("TestDemo", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        Gson gson = new Gson();
        String json = gson.toJson(list);
        editor.putString(key, json);
        editor.apply();     // This line is IMPORTANT !!!

    }

step 3: You need to create function to get array list from SharedPreferences.

    public ArrayList<Bean> getArrayList(String key)
    {

        SharedPreferences prefs = getSharedPreferences("TestDemo", Context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = prefs.getString(key, null);
        Type type = new TypeToken<ArrayList<Bean>>() {}.getType();
        return gson.fromJson(json, type);

    }

step 4: How to call save and retrieve array list function.

ArrayList<Bean> listSave=new ArrayList<>();
listSave.add(new Bean("test","1"));
listSave.add(new Bean("test","2"));
saveArrayList(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<Bean> listGet=new ArrayList<>();
listGet=getArrayList("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());

=> Don't forgot to add gson library in you app level build.gradle.

implementation 'com.google.code.gson:gson:2.8.2'

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.