Reputation: 1
How can I save my arraylist of objects so they are restored when app restarts. I have tried to store it in bundle and restore it using savedinstancestate but everytime I restart the app, all data is gone and it starts from beginning(with empty list).
my code for Area class is
public class Area implements Parcelable {
// region Properties
public String id;
public String name;
public double latitude;
public double longitude;
public float radius;
// end region
// region Public
//creates a named area
public Area(String name, double latitude, double longitude, float radius){
this.id = UUID.randomUUID().toString();
this.name = name;
this.longitude= longitude;
this.latitude = latitude;
this.radius = radius;
}
// endregion
public Area(Parcel in){
id = in.readString();
latitude = in.readDouble();
longitude = in.readDouble();
name = in.readString();
radius = in.readFloat();
}
//getters
public String getId(){return id;}
public double getLatitude(){return latitude;}
public double getLongitude(){return longitude;}
public float getRadius(){return radius;}
public String getName(){return name;}
//setters
public void setName(String name){this.name = name;}
public void setLatitude(double latitude){this.latitude=latitude;}
public void setLongitude(double longitude){this.longitude=longitude;}
public void setRadius(float radius) {
this.radius = radius;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeDouble(latitude);
dest.writeDouble(longitude);
dest.writeString(name);
dest.writeFloat(radius);
}
public static final Parcelable.Creator<Area> CREATOR = new Parcelable.Creator<Area>()
{
public Area createFromParcel(Parcel in)
{
return new Area(in);
}
public Area[] newArray(int size)
{
return new Area[size];
}
};
@Override
public String toString(){return this.name + " " + this.radius;}
// endregion
}
Used this method for saving and restoring in bundle
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
super.onSaveInstanceState(savedInstanceState);
// Here you can save your data
// If you want to store your ArrayList, it should implement Parselable
savedInstanceState.putParcelableArrayList("STORE_KEY", areas);
}
/**
* Restoring data
*/
@Override
public void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
areas = savedInstanceState.getParcelableArrayList("STORE_KEY");
}
}
Oncreate method is
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
areas = new ArrayList<Area>();
if(savedInstanceState != null){
areas = savedInstanceState.getParcelableArrayList("STORE_KEY");
}
if (areas.isEmpty()) {
Log.d("area list lala", "is empty");
}
else {
for (int i = 0; i < areas.size(); i++) {
Log.d("area list lala", areas.get(i).getName());
Log.d("area list lala", String.valueOf(areas.get(i).getRadius()));
}
}
There is also overrided onresume function
@Override
protected void onResume() {
super.onResume();
}
Upvotes: 0
Views: 689
Reputation: 1092
Serialize your objects ... Throw the following into a utility class
public static void writeObject(String fileName, Object object) throws Throwable
{
FileOutputStream file = new FileOutputStream(fileName);
write(file, object);
file.close();
}
public static Object readObject(String fileName) throws Throwable
{
if (!(new File(fileName)).exists()) return null;
else
{
FileInputStream file = new FileInputStream(fileName);
Object object = read(file);
file.close();
return object;
}
}
private static void write(OutputStream os, Object object) throws IOException
{
GZIPOutputStream gos = new GZIPOutputStream(os);
ObjectOutputStream oos = new ObjectOutputStream(gos);
oos.writeObject(object);
oos.close();
gos.close();
}
private static Object read(InputStream is) throws Throwable
{
GZIPInputStream gis = new GZIPInputStream(is);
ObjectInputStream ois = new ObjectInputStream(gis);
Object object = ois.readObject();
ois.close();
gis.close();
return object;
}
Then serialize your object like:
Util.writeObject("C:\\myList.obj", myListArrayObject);
Then on startup de-serialize back into your object like:
myListArrayObject= (ArrayList<String>)Util.readObject("C:\\myList.obj");
Upvotes: 0
Reputation: 113
How about storing your objects in SQLite database or db4o (more about it), that is specifically designed for storing objects.
This is the article about serialization of your objects into the byte stream.
Upvotes: 1
Reputation: 605
Edit:
I don't know if this is possible in Java but in c# I would use XML Serialization...
Upvotes: 0